导读:为什么选择

导读:为什么选择 Kotlin

2017年5月19日 Google I/O 大会上,谷歌公司宣布 Kotlin 语言作为 Android 应用开发一级语言。由于工作需要的原因,我在 2015 年就接触到 Kotlin 语言,被它的简洁理念深深地吸引。我将以前用 Java 编写的 QQ 聊天工具用 Kotlin 语言重新编写,代码减少了30%。Kotlin 语言的设计者们,设计这门语言的目的是取代 Java。诞生了20多年的 Java 虽然还是排名第一的语言,但 Java 语言有很多诟病,我们从如下几个方面讨论一下。

对函数式编程的支持

Java 对函数式编程的支持不够及时和彻底,直到 Java 8 才开始支持函数式编程,但 Java 8 中并不支持函数类型,不能定义高阶函数;而 Kotlin 彻底支持函数式编程。我们可以比较一些代码:

// Java面向对象代码片段
String userId = (String) jsonObj.get("user_id");
// 从clientList集合中删除用户
for (ClientInfo info : clientList) {
    if (info.getUserId().equals(userId)) {
        clientList.remove(info);
        break;
    }
}
// Kotlin函数式编程代码片段
val userId = jsonObject["user_id"] as String
val clientInfo = clientList.first {
    it.userId == userId
}
// 从clientList集合中删除用户
clientList.remove(clientInfo)

从上述代码比较可见函数式编程中不再需要那些 for 和 if 等流程控制语句,对于数据的处理更加简洁。函数式编程并不能完全取代面向对象编程,函数式编程擅长进行数据处理,如核心业务逻辑、算法实现等;而面向对象擅长构建UI界面编程、搭建系统架构等。

异常处理的理念

Java 把异常分为受检查异常和运行期异常,编译器强制要求受检查异常必须捕获或抛出。事实上经过多年的实践,开发者发现即便是捕获了那些受检查异常处理起来也力不从心。受检查异常会使得程序结构变得混乱,代码大量增加。而 Kotlin 把所有的异常都看做是运行期异常,编译器不会强制要求捕获或抛出任何异常,开发人员可以酌情考虑是否捕获处理异常。 我们再比较一些代码:

// Java文件复制代码片段
try (FileInputStream fis = new FileInputStream("./TestDir/src.zip");
        BufferedInputStream bis = new BufferedInputStream(fis);
        FileOutputStream fos = new FileOutputStream("./TestDir/subDir/src.zip");
        BufferedOutputStream bos = new BufferedOutputStream(fos)) {

    // 准备一个缓冲区
    byte[] buffer = new byte[1024];
    // 首先读取一次
    int len = bis.read(buffer);

    while (len != -1) {
        // 开始写入数据
        bos.write(buffer, 0, len);
        // 再读取一次
        len = bis.read(buffer);
    }
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

// Kotlin函数式编程代码片段
FileInputStream("./TestDir/src.zip").use { fis ->
    FileOutputStream("./TestDir/subDir/src.zip").use { fos ->
        // 复制到输出流
        fis.buffered().copyTo(fos.buffered())
        println("复制完成")
    }
}

上述代码实现了文件复制,Java 代码需要21行,而 Kotlin 代码只需要7行。

对可空类型的支持

空指针异常是 Java 最为头痛的问题之一,Java 数据类型可以接收空值。而 Kotlin 数据类型默认不能接收空值,是非空数据类型,这样保证了数据类型的安全,防止空指针异常的发生。

这里我们只是比较了 Java 和 Kotlin 几个最突出的区别,更多的不同和细微的差别,还需要读者阅读此书,并自己编写其中的每一个示例,感受它们与 Java 的不同,感受 Kotlin 的简洁。

上一篇
下一篇
目录