前言

前言

2017年5月19日Google I/O大会上,谷歌公司宣布Kotlin语言作为Android应用开发一级语言。国内掀起了学习Kotlin的热潮,就像2014年苹果公司发布Swift语言一样,一夜之间出现了很多团队翻译官方文档,录制视频课程。我听说了这个消息也非常激动,也想写一本书Kotlin立体图书,包括:电子书、课件和答疑服务。经过了6个多月专注写作和实践终成此书,6个月来放弃很多对家人的陪伴,感谢她们的理解和宽容。

由于工作需要的原因,我在2015年就接触到Kotlin语言,被它的简洁理念深深地吸引。我将以前用Java编写的QQ聊天工具用Kotlin语言重新编写,代码减少了30%。Kotlin语言的设计者们,设计这门语言的目的是取代Java。诞生了20多年的Java虽然还是排名第一的语言,但Java语言有很多诟病,我们从如下几个方面讨论一下。

  1. 对函数式编程的支持

    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界面编程、搭建系统架构等。

  2. 异常处理的理念

    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行。

  3. 对可空类型的支持

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

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

本书服务网址

为了更好地为广大读者提供服务,我们专门为本书建立了一个服务网址www.zhijieketang.com/group/6,希望读者对书中内容发表评论,提出宝贵意见。

源代码

书中包括了200多个完整的案例项目源代码,大家可以到本书网站www.zhijieketang.com/group/6下载免费注册下载。

我们的联系方式

作者微博:@tony_关东升

邮箱:eorient@sina.com

智捷课堂在线课堂:www.zhijieketang.com

智捷课堂微信公共号:zhijieketang

读者服务QQ群:547370999

 

关东升 2017年11月28日 于鹤城

目录

  • 目录
  • 简介
  • 前言
  • 第 1 章 开篇综述
  • 第 2 章 开发环境搭建
  • 第 3 章 第一个Kotlin程序
  • 第 4 章 Kotlin语法基础
  • 第 5 章 Kotlin编码规范
  • 第 6 章 数据类型
  • 第 7 章 字符串
  • 第 8 章 运算符
  • 第 9 章 程序流程控制
  • 第 10 章 函数
  • 第 11 章 面向对象编程
  • 第 12 章 继承与多态
  • 第 13 章 抽象类与接口
  • 第 14 章 函数式编程基石——高阶函数和Lambda表达式
  • 第 15 章 泛型
  • 第 16 章 数据容器——数组和集合
  • 第 17 章 Kotlin中函数式编程API
  • 第 18 章 异常处理
  • 第 19 章 线程
  • 第 20 章 协程
  • 第 21 章 Kotlin与Java混合编程
  • 第 22 章 Kotlin I/O与文件管理
  • 第 23 章 网络编程
  • 第 24 章 Kotlin与Java Swing图形用户界面编程
  • 第 25 章 轻量级SQL框架——Exposed
  • 第 26 章 反射
  • 第 27 章 注解
  • 第 28 章 项目实战1:开发PetStore宠物商店项目
  • 第 29 章 项目实战2:开发Kotlin版QQ2006聊天工具