去年的Google I/O 2017 Keynote上, 谷歌宣布将Kotlin语言作为安卓开发官方编程语言,Kotlin是JetBrains公司开发,与Java 100%互通,并具备诸多Java尚不支持的新特性。本文讲讲使用Kotlin可以给我们带来的好处。
一、简洁
对于Java来说Kotlin的简洁体现在很多方面,最明显的就是在Kotlin语法中直接省略了分号,并且在构造一个类的实例时省略了new关键字,下面是一段示例Kotlin代码:
fun sayHi(name: String): String {
val sb = StringBuilder(str = "Hellow")
sb.append(name)
return sb.toString()
}
再看一个Kotlin官网的示例代码,感受一下Kotlin的简洁:
data class Customer(val name: String, val email: String, val company: String)
使用java实现需要大概50多行代码, 而Kotlin简单的一行代码便实现了一个包含了constructor以及默认getters, toString, equals, hashCode和copy实现的Pojo。
Kotlin还在Java集合类的基础上进行了封装,并提供了丰富的集合操作。同时结合简洁的Lambda表达式,使得调用更加精简。
val numbers = 1..10
val doubles = numbers.map {it * 2}
val sumOfSquares = doubles.fold(0) {x,y -> x+y}
除了这些,Kotlin还提供了很多类似字符串模板、标准函数库、运算符重载的特性,这些特性使得代码可以非常简洁易读,极大提升了开发者的体验。
二、安全
在Java和许多编程语言中常常出现访问空的指针,导致空指针异常。Kotlin的安全性主要体现在它对Null-Safety的支持上。能够使代码在编译期间就察觉到NullPointerException,让Java developer能够轻松避免NullPointerException。
var output: String
output = null // Compilation error
val name: String? = null // Nullable type
println(name.length()) // Compilation error
为了提供安全检查的同时的便捷,Kotlin提供了一些类型推断和自动转型的特性。
下面是一个官网上的样例,Kotlin在类型检查为true时,可以自动完成Any变成Invoice类型的转换:
fun calculateTotal(obj: Any) {
if (obj is Invoice)
obj.calculateTotal()
}
三、Kotlin和Java是可以相互调用的。
我们可以利用任何已有的Java libraries来构建我们的应用,可以使用之前熟悉的Java经验。
...
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.jpa.repository.JpaSpecificationExecutor
...
interface AreaRepository : JpaRepository, JpaSpecificationExecutor {
fun existsByAreaId(id: UUID): Boolean
fun findOneByAreaId(areaId: UUID): AreaEntity?
}
上面例子中是用Kotlin编写基于Spring JPA的Repository,因为Kotlin和Java是可以相互调用的,在使用Kotlin时我们同时可以应用一个完整的Java生态圈。可以用之前所熟悉的框架、构建工具、开发工具和测试工具。
如果你的项目已经开始了,我们可以先使用Kotlin编写单元测试
这样你可以不用担心尝试Kotlin给你的项目代码带来风险,同时也可以在编写单元测试的过程中尝试Kotlin语言的各种特性。
或者可以使用Kotlin来扩展
用Kotlin来丰富项目中所用到的Library,使用Kotlin Extensions来在不需要继承的情况下完成对原有类型的扩展。或者直接通过Kotlin来编写工具类为项目服务。
//Extensions.kt
fun String.lastChar() = this.get(this.length - 1)
fun KPerson.fullName() = "${this.firstName} ${this.lastName}" //String template
//Java JUnit test
Test
public void lastChar() throws Exception {
assertEquals('n', Extensions.lastChar("Kotlin"));
}
Test
public void fullName() throws Exception {
KPerson k = new KPerson("Foo", "Bar", Gender.MALE, 18);
assertEquals("Foo Bar", Extensions.fullName(k));
}
又或者可以使用Kotlin来重写微服务
比如你在用基于Spring Boot的微服务,可以选一个比较不重要的服务逐步通过Kotlin进行改写。改写很顺畅,不会改变你之前通过Spring Boot构建微服务的方式。
以上几种方法都可以让你开始尝试Kotlin。