本文由 Prefert 发表在 ScalaCool 团队博客。android
在今年的 Google I/O 大会上,Google 宣布在 Android 上为 Kotlin 提供一等支持(转为正房)。git
在 Andorid 开发的圈子中,这无疑掀起了轩然大浪。对部分人来讲,也许这是第一次听到 Kotlin 。事实上,在 2011 年 7 月,JetBrains 就推出 Kotlin 项目,直到去年 2 月 Kotlin v1.0 才正式发布。程序员
本系列文章「Dive Into Kotlin」将会对 Kotlin 进行较为系统的介绍,大体分为四个章节:github
1. 热身 —— Kotlin 基本特性
2. 下水 —— Kotlin 与函数式
3. 潜入 —— Kotlin 核心
4. 遨游 —— kotlin 与 Android 实战编程
本文将简单介绍 Kotlin 的生态和部分语言功能,目录以下:安全
Kotlin 是一种在 JVM 上运行的静态类型编程语言,能够编译成 Java 字节码,也能够编译成 JavaScript,方便在没有 JVM 的设备上运行。框架
简约:帮你减小实现同一个功能的代码量。编程语言
易懂:让你的代码更容易阅读,同时易于理解。ide
安全:移除了你可能会犯错误的功能。函数式编程
通用:基于 JVM 和 JavaScript,你能够在不少地方运行。
互操做性: Kotlin 和 Java 能够相互调用,同时 Jetbrains 的目标是让他们 100% 兼容。
对比 Java,Kotlin 或许显得有点年轻,但这并不表明它的生态圈不够稳定。
Kotlin 编译为 JVM 字节码或 JavaScript
它能够吸引全部使用垃圾回收机制语言的程序员,包括 Java,Scala,Go,Python, Ruby 和 JavaScript。
kotlin 产自工业,而不是学术界。
它解决了程序员目前所面临的一些问题。举个例子:类型系统能够帮助你避免空指针异常。当咱们在使用一些 API 或者大型库时判断是否为 null,每每没有什么实际做用。
Kotlin 完美兼容 Java
在 Idea 中,你能够一键实现 Java 与 Kotlin 的转换。也就是说, Kotlin 写的项目中可使用全部现有的 Java 框架和库,甚至是依赖于注解的高级框架,而且它整合了 Maven,Gradle 和其余构建工具——帮助咱们实现无缝的互操做。
Kotlin 相对入门简单
因此正如你们所说的那样,Kotlin 是一门十分友好的语言,你甚至能够花几个小时阅读下相关书籍就能入门。它的语法简洁直观,也许大多时候看起来比较像 Scala,实际上简单了不少。这种语言很好地平衡了简洁和可读性。
不施加运行时间的开销
标准库是比较小的:主要是对 Java 标准库的重点扩展。大量使用编译时内联(compile-time inlining)就意味着像 map
、 filter
、 reduce
这样的语法编译起来与命令式的类似。
Android扩展库
Anko 与 kovenant 让 Kotlin 在 Android 的开发中更加方便,若是你看过这两个库,必定也为之青睐。
除 Android 外,其实企业级别的 Java 项目也能够考虑使用 Kotlin:
它有一个成熟的公司强大的商业支持,JetBrains 致力于该项目的发展,拥有一支高效的团队和稳定的商业模式。在较长的时间内,你都不用担忧 Kotlin 被抛弃。
Kotlin 的风险很低:能够由一两个成员尝试在某个功能块使用,但并不会影响其余模块:Kotlin 类能够导出一个与常规 Java 代码看起来相同的 Java API。
Java 6 废土中的一线但愿:若是升级 JVM 对于大家的成本很高,你可使用 Kotlin,它是「增强版的 Java 6」。
看完生态圈,来看看最吸引咱们的语言功能部分。
Java Bean 中老是出现一些重复工做量的代码:
public class Customer{
String name;
int age;
public Customer(String name, int age){
this.name=name;
this.age=age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
public setName(String name){
this.name=name;
}
public setAge(int age){
this.age=age;
}
}
复制代码
在 Java 对象中,构造函数和属性的 Getter
、Setter
函数在每一个Bean类中都会出现,看起来很是冗余。
可是使用 Kotlin,代码是这样的:
data class Customer(val name:String, val age:Int)
复制代码
Kotlin 将Getter
、Setter
等函数省略,让咱们更加关注属性。
若是你是一名 「FP」 (Functional Programming) 爱好者,你确定知道 Scala 这门语言。而 Kotlin 的设计初衷就是提供 Scala 里的不少特性,但不被编译时间束缚。
网上对函数式编程的介绍,大多数对初学者都是不够友好的,下面是一种比较简洁的归纳:
函数编程以基于数学的函数构成,实现一个功能时倾向于实现的目标,而不是实现目标的方式。
也就是说,函数式编程处理的是不可变的数据,即不会改变变量的值。它所作的只是 Receive(接收)-> Compute(计算)-> Return(返回) ,而不改变它接收到的值,或者引发「反作用」。
// Java
void check(boolean isAlpha, boolean isNum){
// do something
}
check(true, false); // 函数调用
// Kotlin
fun check(isAlpha:Boolean, isNum:Boolean = false) {
// do something
}
check(true)// 1
check(true,true)// 2
check(isAlpha = true, isNum = false) // 3
check(isNum = false, isAlpha = true) // 4
复制代码
其中一、三、4实际效果一致。
// Java
int sum (int x, int y){ // 必须声明返回类型
x = x + y; // x的值被改变,带来反作用
return x;
}
// kotlin
fun sum(x: Int, y: Int) = x + y // 完美
复制代码
在 Android 开发时,咱们应该都会对视图的 onClick
事件感到烦躁。
// Java
view.setOnClickListener(new View.OnClickKistener() {
@ Override public void onClick(View v){
System.out.println("sad");
}
});
复制代码
在 kotlin 中,这也获得简化:
view.onClick {
println("nice !!")
}
复制代码
在 Android 开发中,出现 NullPointerException
已经能够说是屡见不鲜了。但若是在运行的时候出现这个异常致使程序崩溃,对用户体验形成的损失是巨大的。
Kotlin 能很好的避免这个问题:
// Java
String text1 = null // NE
// Kotlin
var text1: String = "Kotlin"// 正常
var text2: String = null // NE
var text3: String ?= null // 正常
复制代码
Kotlin 中只有加了 ?
才容许为 null。
?
确保安全调用:// Java
if(a != null){
int x = a.length();
}
// Kotlin
val x = a?.length // 仅当 a 不为 null 时才能经过编译
复制代码
val x = b?.length ?: 0 // 若是 b 为 null,那他的 length 就为0
val x = b?.length ?: throw NullPointerException()
val x = b!!.length
复制代码
Lambda 表达式增长了 Kotlin 的简洁功能,从而也让代码更容易理解。(Java 6 不支持 lambda )
val sum = {x: Int, y: Int -> x + y} // 类型:(Int, Int) -> Int
val result = sum(2, 7)// result == 9
复制代码
kotlin 中 when
一样能带给你惊喜,你能够用它简化 if..else
或 switch
:
// Java
if(x == 1) println("x is 1");
else if(x == 2) println("x is 2");
else if(x == 3 || x == 4) println("x is 3 or 4");
else if(x >= 5 || x <= 10) println("x is 5, 6, 7, 8, 9, or 10");
else println("x is out of range");
// Kotlin
when (x) {
1 -> print("x is 1")
2 -> print("x is 2")
3, 4 -> print("x is 3 or 4")
in 5..10 -> print("x is 5, 6, 7, 8, 9, or 10")
else -> print("x is out of range")
}
复制代码
固然除了以上这些,Kotlin 还有许多使人惊喜的特性,将会在后续的文章中详细介绍,敬请期待。