欢迎来到Kotlin的世界!本书的重点不仅在于讲解Kotlin的语法与语义,还将向你展示何时以及为何应该使用某个特定的语言特性。本书不会涵盖每一个Kotlin语法与库的细节,但在最后添加了很多基本原理的“食谱”,让即使只有Kotlin初级知识的读者也可以理解本书的内容。
JetBrains大力鼓励Kotlin社区拥抱多平台(Multiplatform)、原生(Native)以及JavaScript开发的发展。由于它们还处于测试阶段且使用率很低,所以最后还是决定不在本书中介绍它们。因此,本书只专注于运行在JVM上的Kotlin。
存放本书所有相关代码的Github仓库位于https://github.com/kousen/kotlin-cookbook。它包含一个Gradle包装器(当然,构建文件是用Kotlin DSL编写的)并且通过了所有的测试。
本书中所有的代码示例均已通过两种长期支持的可用Java版本进行了编译与测试,即Java 8与Java 11。尽管Java 8在技术上已超过其生命周期的最后期限,但它在业界依然被普遍使用,代码示例确保可以在其上运行。在本书写作过程中,Kotlin的版本是1.3.50,而当前版本则是1.3.60译注1。所有的代码都可以在这两个版本上运行,并且Github仓库将经常更新以使用最新版的Kotlin。
【本书目标读者】
本书面向已经了解面向对象编程基础的开发者,特别是了解Java以及其他基于JVM的语言的读者。拥有Java知识将会有所帮助,但这不是必需的。
本书更侧重于Kotlin的使用技巧与习惯用法,而不是成为这门语言的详尽资源。其优点在于在任何给定的示例中可以发挥这门语言的所有潜力,但缺点在于对这些特性的基础部分介绍有限。本书每一章都包含了该章相关基础技术的简介,所以如果你只是模糊地知道如何创建集合、使用数组,或设计类,那么已经相当不错了。在线参考手册(https://kotlinlang.org/docs/reference)对Kotlin进行了详尽的介绍,所以本书经常引用其中的示例与讨论。
此外本书还经常介绍Kotlin库函数的实现。这是为了展示这门语言的开发者如何在实践中使用它们,并讨论这些函数的设计方式。如果你很着急,无须预先了解实现,可以跳过这些细节。
【本书主要内容】
本书分为13章,每一章都是独立的,但本书引用了许多其他资料。你可以按任意喜欢的顺序阅读本书。
第①章讲解了安装并运行Kotlin的基本过程,包括使用REPL,使用诸如Maven以及Gradle等构建工具,以及在Graal中使用原生镜像生成器。
第2章讲解了Kotlin的基本特性—例如可空类型、操作符重载以及类型转换,然后介绍了一些更深奥的问题,包括按位移位操作符或者在Pair类上编写扩展函数等。
第3章重点介绍了Kotlin的面向对象特性,而该部分内容可能会让其他语言的开发者对此感到惊讶或不明所以。它包含如何使用const关键字、Kotlin如何处理幕后属性、延迟初始化以及令人恐惧的Nothing类,这些内容一定会令现有的Java开发者感到困惑。
第4章只有很少的一部分内容,其中涵盖一些需要被解释说明的函数式特性。函数式编程概念会始终贯穿全书,特别是当我们谈论集合、序列以及协程时,但该章中包含的一些有用的技巧可能会让你感觉到不同寻常或非常有趣。
第5章介绍了数组与集合,主要介绍一些不那么为人所知的方法,例如集合解构、按多个属性排序、在集合上构建窗口,以及创建数列。
第6章展示了Kotlin如何惰性处理序列中的元素,类似于在Java中使用流的方式,内容包含生成序列、在序列中生产元素以及使用无限序列。
第7章涵盖了Kotlin独有的另一个主题:在对象的上下文中执行代码块的函数。诸如let、apply以及also这类函数在Kotlin中非常有用,该章会说明为什么以及如何使用它们。
第8章讨论了Kotlin中的一个便捷特性:如何实现委托。委托可以让你使用组合而不是继承,Kotlin的标准库包含了一系列的委托,例如lazy、observable以及vetoable。
第9章涵盖了有关测试的重要主题,将会重点关注JUnit5。在当前版本下,JUnit已经被设计为可以与Kotlin良好地配合使用,其中包括常规用法以及在Spring框架应用程序中使用。该章会讨论使编写与执行测试更加容易的几种方式。
第10章涵盖了一些专门用于资源管理的方法,包括文件I/O,以及在多种情况下具有广泛适用性的use函数。
第11章介绍了其他类别的书中不容易找到的主题。诸如如何获取当前Kotlin版本,如何强制when语句在即使没有返回值的时候也要覆盖所有情况,以及如何在正则表达式中使用replace函数。此外,也讨论了TODO函数和Random类,以及如何与Java异常处理集成。
第12章涉及对Kotlin非常友好的Spring框架与Spring Boot,少量内容展示了如何将Kotlin类作为托管的bean、如何实现JPA持久性,以及如何在需要的时候进行依赖注入。
第13章介绍协程。协程是Kotlin中最受欢迎的功能之一,也是这门语言并发与并行编程的基础,内容包含基础知识,例如构建器与调度器、如何取消与调试协程,以及如何在自定义的Java线程池中运行它们。
这13章的内容不需要按特定顺序阅读。它们相辅相成,你可以从任何地方开始阅读。章节分组提供了一种将相似内容放在一起的方式,但是我们还是希望你可以在各章节之间自由跳跃从而解决你当前可能遇到的任何问题。
【给Android开发者的特别建议】
Kotlin目前是Android开发的首选语言,但它是一种更广泛的通用语言。你可以在任何原先使用Java的地方以及其他更多场景中使用它。本书没有专门针对Android的章节,相反,将全面讨论Kotlin在Android中的应用。一些与Android有关的特定内容(例如协程的取消),利用了Android库广泛使用Kotlin的事实,但一般来说,本书涵盖的语言特性可以在任何地方使用。本书希望以一种更通用的方式覆盖这门语言,使Android开发者能学到在开发任何项目时都有用的技巧。
◆推荐序 ◆
序言
每隔几年,就会出现一种革命性的新语言,它们常常扬言要改变人们编写软件的方式。但现实却常常辜负它们。而Kotlin则与它们有所不同。将时光回退到2011年,Kotlin开始缓慢地、几乎不可察觉地悄悄进入世界各地的代码库。那些长期使用Java并且发现了它的缺点的人们开始到处学习Kotlin。正因如此,他们缩短了代码的长度却增强了代码的功能。
Kotlin作为Android开发的首选语言而闻名,而如今Kotlin已经足够成熟,所以迫切需要一本像本书这样的书。本书从头开始讲解了许多有用的技巧。作者将向你展示如何安装Kotlin以及为你的项目配置它。他也会向你展示如何在Java环境、浏览器中或作为一个独立的应用程序来运行Kotlin。但本书会快速推进内容,解决世界各地的开发者与架构师所面临的日常编程问题。
尽管有一小节是专门讲解Kotlin测试的,但你会发现本书本身就是测试驱动的。它将测试作为如何使用这门语言的实际示例。通过测试,你可以更精确地调整方案以适应你的需求。
本书将带给你直接而实用的帮助,可以指导你在Kotlin旅途中快速进步。本书是Kotlin必不可少的操作指南,每个开发者都应将其保存在桌面(真实或虚拟)上,以支持日常工作。
Dawn Griffiths与David Griffiths
Head First Kotlin的作者
2019年10月6日