2011 年,做为全球最早进 IDE 开发商之一的 JetBrains 揭露了一项正处于开发中的编程语言 —— Kotlin。它是一门跑在 JVM 上,和 Java 间具备高互操做性的全新语言。JetBrains 经过多年来和各类编程语言打交道的经验,为 Kotlin 整合了多项现代编程语言特性。html
2017 年,Google 在 I/O 大会上宣布将 Kotlin 做为 Android 开发的官方支持语言。彼时,Kotlin 的开发者社区开始了爆炸性的增加,而 Netflix、Pinterest、Trello、Kickstarter 等知名公司也早已开始使用 Kotlin。java
2018 年,目前 Kotlin 1.3 正式版本已经发布,更多的语言特性获得了支持。而随着官方提供了更多的编译后端,也让 Kotlin 摆脱了 JVM 的束缚,使用 Kotlin 编写的代码能够编译成机器码甚至 JavaScript 而跑在不一样的运行环境中。另外,根据 Google 官方的调查,目前已有 40% 的 Android 开发者选择使用 Kotlin 进行编程工做,国内抖音、网易有道词典、大众点评、知乎等大量应用也开始引入 Kotlin。android
既然 Google 已经宣布 Kotlin 成为 Android 开发的官方支持语言,也说明了至少在 Android 开发上使用 Kotlin 目前已经毫无障碍了。那么做为 Android 开发者,对比 Java 而言,使用 Kotlin 语言能得到什么好处呢?git
第一点,使用 Kotlin 可以让咱们的代码变得更简洁。咱们都知道 Java 以它语法的严谨性而著名,它支撑起了世界上各类大型、复杂的计算机软件。然而 ,它的语法是有历史包袱并且略显啰嗦的,对比更灵活的现代语言,使用 Java 来实现一样的逻辑一般须要写更多的代码。而没有历史包袱的 Kotlin 则吸收了现代语言各类灵活简洁的语法,让开发者在 JVM 上也能写出简洁的代码:github
// Java
final ArrayList<String> a = new ArrayList<>();
// Kotlin
val a = ArrayList<String>()
// Java
public String b(String c) {
return "Test: " + c.substring(2);
}
// Kotlin
fun b(c: String) = "Test: ${c.substring(2)}";
复制代码
除了语法上的各类简便,Kotlin 的标准库也提供了不少实用的方法来精简你的代码,例如针对开发中最经常使用的「集合」,Kotlin 提供了封装让你能够轻松建立集合类、使用和 Java Stream 类似但更丰富的接口来操做集合:编程
// 建立包含元素 一、三、五、7 的 ArrayList
arrayListOf(1, 3, 5, 7)
// 过滤出集合中大于 3 的元素
.filter { it > 3 }
// 转换成字符串
.map { "$it, " }
// 循环输出
.forEach { println(it) }
复制代码
更多 Kotlin 比 Java 语法更精简的例子能够查看 From Java to Kotlin 。后端
第二点,使用 Kotlin 能让你的程序更安全。Java 工程师最多见陷阱之一就是访问了空的引用而致使空指针异常,而 Java 在语法上没法描述某个引用是否可空,因此开发者要背负起更多的心智负担而不得不常常进行判空操做。虽然目前能够经过 Annotation + IDE 提示的方式来必定程度上减轻这个负担,但这并非一个强约束,在 IDE 上的提示是可被忽略的。安全
而 Kotlin 在语法上对此进行了强约束。在 Kotlin 中定义某个引用时必须描述其是否为可空类型,对于可空类型引用的不安全访问会在编译期报错:bash
// 不可空类型,能够直接访问
val a: String = ""
a.substring(2)
// 可空类型
val b: String? = null
b.substring(2) // 不安全访问,编译报错
复制代码
这有利于在运行前察觉并处理可能的空指针异常。并且 Kotlin 还提供了 ?.
、?:
、类型自动转换等便捷的语法来辅助处理可空类型:app
val b: String? = null
b?.substring(2) // 当 b 不为空时才调用 substring()
if (b is String) {
b.substring(2) // 自动把 b 转换成不可空类型
}
val c = b ?: "" // 若是 b 为空的话,则返回 ?: 操做符右边的值
复制代码
以上两点是 Kotlin 能给大多数 Java 开发者带来的直接好处。但 Kotlin 能给开发者带来的也不只仅只有这些,它有着完美的 IDE 支持(这也正是 JetBrains 的强处),它与 Java 之间的高互操做性让你能够轻松使用 Java 生态中丰富的库,而它对各类现代语言新特性(例如协程、函数式编程)的支持,能让你在面对不一样的计算机问题时有更多不一样的思考和解决方式。
咱们要知道,任何编程语言在设计时都须要作各类取舍。Kotlin 在提供高灵活性的背后也须要开发者付出必定的代价:
实际上这也是大多数语法灵活、语法糖多的语言的共同问题。但咱们没必要过于担忧,经过使用强大的 IDE 和创建代码规范这些问题都能被解决。做为开发者,咱们应该把精力放在用更少的代码、更快、更方便地描述出咱们想要的「逻辑」上,其余的负担都交给编译器或 IDE 吧,这也正是高阶编程语言诞生的初衷。
总所周知,因为 Google 和 Oracle 之间的各类政治斗争,致使 Android 开发者一直以来只能用上阉割版的 Java。大部分开发者甚至是最近几年才开始用上、甚至开始知道 Lambda 表达式,而像 Stream 之类的工具更是无人知晓。虽然期间有传闻过要支持 Go 和 Dart 语言,但很快也都音讯全无了。
而 Kotlin 的出现正好弥补了 Android 开发生态中一块巨大的短板 —— 落后的开发语言。并且,Kotlin 和 Java 十分类似(甚至不少人把它认为是 Java 的加强版),因此从 Java 过渡到 Kotlin 的门槛比起其余语言来讲相对更低。而基于 JVM 又让 Kotlin 的代码能够很轻松地运行在 Android 平台上。这么看来,Kotlin 确实比起 Google 本身的 Go 和 Dart 来讲更适合做为 Android 平台的开发语言,也难怪 Google 最终敲定 Kotlin。
纵观将来,随着 Google 和 JetBrains 深度的合做,Kotlin 也确定会成为 Android 开发生态中最早进的工具之一。目前经过 Kotlin Android Extensions 已经能够很方便地在 Activity 中直接经过 Id 名来直接访问对应的 View:
import kotlinx.android.synthetic.main.activity_main.*
// 设置 id 为 helloTextView 的 TextView 的文本
helloTextView.text = "Hello World!"
复制代码
而 Google 官方推出的 KTX 库 更是让开发者可以更方便地使用 Kotlin 来开发 Android 应用:
// 使用 KTX 前
view.viewTreeObserver.addOnPreDrawListener(
object : ViewTreeObserver.OnPreDrawListener {
override fun onPreDraw(): Boolean {
viewTreeObserver.removeOnPreDrawListener(this)
actionToBeTriggered()
return true
}
}
)
// 使用 KTX 后
view.doOnPreDraw {
actionToBeTriggered()
}
复制代码
另一个好消息是,今年 11 月刚发布的 Gradle 5.0 也宣布支持了 Kotlin DSL,这意味着咱们甚至能够用 Kotlin 来写咱们的构建脚本了:
android {
compileSdkVersion(27)
defaultConfig {
applicationId = "com.test.app"
minSdkVersion(15)
targetSdkVersion(27)
versionCode = 1
versionName = "1.0"
}
}
复制代码
因此从各类迹象来看,答案其实已经很明显了。Kotlin 的诞生以及被 Google 的钦点,对一直以来被语言限制生产力的 Android 开发者们而言意义非凡。而就 Google 和 JetBrains 的影响力来看,将来几年 Kotlin Android 开发者的数量将呈爆炸式增加,市场对于 Kotlin 工程师的需求也将会不断增长。因此,学习 Kotlin 不但能让你接触到更先进的工具、思想,也确定能让你在人才市场上更具竞争力。
事实上,根据 Github 今年发表的 Octoverse 报告 ,Kotlin 已经成为增加速度最快的语言。
若是你已经对 Kotlin 产生兴趣,能够先经过官方的 Playground 来在线尝试下 Kotlin 的语法。它还包括一些列用于演示各类语法的实例,以及一个完整的语法课程。
若是你想在本地建立一个全新的使用 Kotlin 编写的 Android 应用项目,参照官方文档中的 Getting started with Android and Kotlin 来进行便可,目前 Android Studio 已经彻底支持 Kotlin 语言。
而若是你想在一个使用 Java 的 Android 应用项目中同时使用 Kotlin,也是彻底没问题的。经过上一个连接的教程引入 Kotlin Gradle Plugin,便可在你的源码目录下经过 Android Studio 菜单直接建立 Kt 源码文件。
有人可能会担忧使用过程当中遇到各类坑 。实际上,笔者在 2015 年就开始使用 Kotlin 了,期间在语法、IDE 支持、Kotlin 注解处理器上都遇到官方很多的坑,但因为官方的迭代速度足够快,不少问题很快就被修复了。另外,Kotlin 的社区也十分活跃,若是遇到坑或者问题也基本都能在上面找到回答。
而自从 16 年 Kotlin 1.0 发布以后的版本就更加稳定了,工具链、IDE 支持也都十分完善。因此大可没必要担忧会遇到没法解决的坑。
有科学家代表,使用不一样的天然语言会影响人的思考方式。而编程,亦是如此。激进的 Kotlin 和保守的 Java 之间的差别,确定会给咱们带来不同的思考问题的方式。而这些不同,也确定会影响将来 Android 开发的新风向。
在笔者看来,Android 开发界随着 Kotlin 的出现实际上已经到了一个新的纪元,浪潮已来,为了避免被浪潮所击退,请用力拥抱 Kotlin 吧!