编辑推荐

  

  《Kotlin实战》教会你使用Kotlin语言来开发达到产品级品质的应用。《Kotlin实战》为具备一定Java经验的开发者编写,包含了丰富的示例,和大多数介绍编程语言的书籍相比更加深入,涵盖了非常有趣的话题,例如怎样构建使用自然语言语法的DSL。两位作者是Kotlin的核心开发者,所以你完全可以相信《Kotlin实战》中细枝末节的内容都无比地精确。

  ●在JVM上进行函数式编程

  ●编写整洁并符合语义习惯的代码

  ●结合运用Kotlin和Java

  ●领域特定语言


  

内容简介

  

  《Kotlin实战》将从语言的基本特性开始,逐渐覆盖其更多的高级特性,尤其注重讲解如何将Koltin集成到已有Java工程实践及其背后的原理。《Kotlin实战》分为两个部分。第一部分讲解如何开始使用Kotlin现有的库和API,包括基本语法、扩展函数和扩展属性、数据类和伴生对象、lambda表达式,以及数据类型系统(着重讲解了可空性和集合的概念)。第二部分教你如何使用Kotlin构建自己的API,以及一些深层次特性——约定和委托属性、高阶函数、泛型、注解和反射,以及领域特定语言的构建。《Kotlin实战》适合广大移动开发者及入门学习者,尤其是紧跟主流趋势的前沿探索者。

作者简介

  原著作者简介

  《Kotlin实战》作者JetBrains为Kotlin的核心开发者,DmitryJemerov从2003年起就在JetBrains工作并参与了许多产品的开发,包括IntelliJIDEA、PyCharm和WebStorm。他是Kotlin早的贡献者之一,创建了初版本的KotlinJVM字节码生成器,并且还在世界各地的活动上做了很多关于Kotlin的演示。之前他带领了进军KotlinIntelliJIDEA插件开发的团队。SvetlanaIsakova从2011年成为Kotlin团队的一员。她从事编译器类型推导和重载解析该系统的工作。现在她是一名技术布道者,在各种会议上进行Kotlin相关讨论并从事Kotlin在线课程的相关工作。

  

  译者简介

  覃宇,ThoughtWorks高级咨询师,10余年移动应用开发经验,Android技术专家,曾为AOSP贡献过测试用例;目前专注于移动应用的架构设计、自动化测试以及持续交付。

  罗丽,高级软件工程师,移动技术开发顾问,拥有丰富的软件开发经验,熟悉ReactNative,Android,iOS等多种开发技术。目前任职于ThoughtWorks海外事业部,曾在多个大型移动应用项目中担任技术顾问。

  李思阳,ThoughtWorks咨询师,移动开发工程师。熟悉Android、MobileWeb相关技术,有着丰富的移动应用开发经验,在移动应用体验和兼容性相关领域有独特的见解;长期关注Android领域相关技术动向。

  蒋扬海,ThoughtWorks移动开发咨询师,深耕Android开发多年,应用开发经验丰富,对Android开发领域的技术有广泛的涉猎,对Android技术动向有着敏锐的洞察力。

精彩书评

开发者想完成他们的工作——同时越省事越好。使用Kotlin编码就意味着省事。Kotlin编程语言提供了赋有表现力的语法,强大直观的类型系统和美妙的工具支持,还有与现存Java代码、库及框架无缝的互操作性。Kotlin可以被编译成Java字节码,所以你可以在所有使用Java的地方使用它,包括Android在内。借助高效的编译器和标准库,Kotlin在运行时几乎不用承受任何额外开销。

——kotlin核心开发者

“既阐释了高级概念,也提供了足够深入的细节。”

—摘自Kotlin首席设计师AndreyBreslav作的序

“这《Kotlin实战》保持了Manning实战系列的水准,满足了你快速提高生成力的所有需要。”

—KevinOrr,SumusSolutions

“有这《Kotlin实战》指导你,Kotlin学起来有趣又简单!”

—FilipPravica,Info.nl

“写得非常全面,非常好,浅显易懂。”

—JasonLee,NetSuite

目录

第1部分Kotlin简介1

1Kotlin:定义和目的3

1.1Kotlin初体验3

1.2Kotlin的主要特征4

1.2.1目标平台:服务器端、Android及任何Java运行的地方4

1.2.2静态类型5

1.2.3函数式和面向对象6

1.2.4免费并开源7

1.3Kotlin应用8

1.3.1服务器端的Kotlin8

1.3.2Android上的Kotlin9

1.4Kotlin的设计哲学10

1.4.1务实10

1.4.2简洁11

1.4.3安全12

1.4.4互操作性13

1.5使用Kotlin工具14

1.5.1编译Kotlin代码14

1.5.2IntelliJIDEA和AndroidStudio插件15

1.5.3交互式shell15

1.5.4Eclipse插件15

1.5.5在线playground15

1.5.6Java到Kotlin的转换器16

1.6小结16

2Kotlin基础17

2.1基本要素:函数和变量17

2.1.1Hello,world!18

2.1.2函数18

2.1.3变量20

2.1.4更简单的字符串格式化:字符串模板22

2.2类和属性23

2.2.1属性24

2.2.2自定义访问器25

2.2.3Kotlin源码布局:目录和包26

2.3表示和处理选择:枚举和“when”28

2.3.1声明枚举类28

2.3.2使用“when”处理枚举类29

2.3.3在“when”结构中使用任意对象30

2.3.4使用不带参数的“when”31

2.3.5智能转换:合并类型检查和转换32

2.3.6重构:用“when”代替“if”34

2.3.7代码块作为“if”和“when”的分支35

2.4迭代事物:“while”循环和“for”循环36

2.4.1“while”循环36

2.4.2迭代数字:区间和数列37

2.4.3迭代map38

2.4.4使用“in”检查集合和区间的成员39

2.5Kotlin中的异常41

2.5.1“try”“catch”和“finally”41

2.5.2“try”作为表达式42

2.6小结44

3函数的定义与调用45

3.1在Kotlin中创建集合45

3.2让函数更好调用47

3.2.1命名参数48

3.2.2默认参数值49

3.2.3消除静态工具类:顶层函数和属性50

3.3给别人的类添加方法:扩展函数和属性53

3.3.1导入和扩展函数54

3.3.2从Java中调用扩展函数54

3.3.3作为扩展函数的工具函数55

3.3.4不可重写的扩展函数56

3.3.5扩展属性58

3.4处理集合:可变参数、中缀调用和库的支持59

3.4.1扩展Java集合的API59

3.4.2可变参数:让函数支持任意数量的参数60

3.4.3键值对的处理:中缀调用和解构声明60

3.5字符串和正则表达式的处理62

3.5.1分割字符串62

3.5.2正则表达式和三重引号的字符串63

3.5.3多行三重引号的字符串64

3.6让你的代码更整洁:局部函数和扩展66

3.7小结68

4类、对象和接口69

4.1定义类继承结构70

4.1.1Kotlin中的接口70

4.1.2open、final和abstract修饰符:默认为final72

4.1.3可见性修饰符:默认为public75

4.1.4内部类和嵌套类:默认是嵌套类76

4.1.5密封类:定义受限的类继承结构79

4.2声明一个带非默认构造方法或属性的类80

4.2.1初始化类:主构造方法和初始化语句块80

4.2.2构造方法:用不同的方式来初始化父类83

4.2.3实现在接口中声明的属性85

4.2.4通过getter或setter访问支持字段87

4.2.5修改访问器的可见性88

4.3编译器生成的方法:数据类和类委托89

4.3.1通用对象方法89

4.3.2数据类:自动生成通用方法的实现92

4.3.3类委托:使用“by”关键字93

4.4“object”关键字:将声明一个类与创建一个实例结合起来95

4.4.1对象声明:创建单例易如反掌95

4.4.2伴生对象:工厂方法和静态成员的地盘98

4.4.3作为普通对象使用的伴生对象100

4.4.4对象表达式:改变写法的匿名内部类102

4.5小结104

5Lambda编程105

5.1Lambda表达式和成员引用105

5.1.1Lambda简介:作为函数参数的代码块106

5.1.2Lambda和集合107

5.1.3Lambda表达式的语法108

5.1.4在作用域中访问变量111

5.1.5成员引用114

5.2集合的函数式API116

5.2.1基础:filter和map116

5.2.2“all”“any”“count”和“find”:对集合应用判断式118

5.2.3groupBy:把列表转换成分组的map119

5.2.4flatMap和flatten:处理嵌套集合中的元素120

5.3惰性集合操作:序列121

5.3.1执行序列操作:中间和末端操作123

5.3.2创建序列125

5.4使用Java函数式接口126

5.4.1把lambda当作参数传递给Java方法127

5.4.2SAM构造方法:显式地把lambda转换成函数式接口129

5.5带接收者的lambda:“with”与“apply”131

5.5.1“with”函数131

5.5.2“apply”函数133

5.6小结135

6Kotlin的类型系统137

6.1可空性137

6.1.1可空类型138

6.1.2类型的含义140

6.1.3安全调用运算符:“?:”141

6.1.4Elvis运算符:“?:”143

6.1.5安全转换:“as?”145

6.1.6非空断言:“!!”146

6.1.7“let”函数148

6.1.8延迟初始化的属性149

6.1.9可空类性的扩展151

6.1.10类型参数的可空性153

6.1.11可空性和Java153

6.2基本数据类型和其他基本类型157

6.2.1基本数据类型:Int、Boolean及其他158

6.2.2可空的基本数据类型:Int?、Boolean?及其他159

6.2.3数字转换160

6.2.4“Any”和“Any?”:根类型162

6.2.5Unit类型:Kotlin的“void”163

6.2.6Nothing类型:“这个函数永不返回”164

6.3集合与数组164

6.3.1可空性和集合165

6.3.2只读集合与可变集合167

6.3.3Kotlin集合和Java168

6.3.4作为平台类型的集合171

6.3.5对象和基本数据类型的数组173

6.4小结175

第2部分拥抱Kotlin177

7运算符重载及其他约定179

7.1重载算术运算符180

7.1.1重载二元算术运算180

7.1.2重载复合赋值运算符183

7.1.3重载一元运算符184

7.2重载比较运算符186

7.2.1等号运算符:“equals"186

7.2.2排序运算符:compareTo187

7.3集合与区间的约定188

7.3.1通过下标来访问元素:“get”和“set”188

7.3.2“in”的约定190

7.3.3rangeTo的约定191

7.3.4在“for”循环中使用“iterator”的约定192

7.4解构声明和组件函数193

7.4.1解构声明和循环194

7.5重用属性访问的逻辑:委托属性195

7.5.1委托属性的基本操作196

7.5.2使用委托属性:惰性初始化和“bylazy()”197

7.5.3实现委托属性198

7.5.4委托属性的变换规则202

7.5.5在map中保存属性值203

7.5.6框架中的委托属性204

7.6小结205

8高阶函数:Lambda作为形参和返回值207

8.1声明高阶函数207

8.1.1函数类型208

8.1.2调用作为参数的函数209

8.1.3在Java中使用函数类211

8.1.4函数类型的参数默认值和null值212

8.1.5返回函数的函数214

8.1.6通过lambda去除重复代码216

8.2内联函数:消除lambda带来的运行时开销218

8.2.1内联函数如何运作219

8.2.2内联函数的限制221

8.2.3内联集合操作222

8.2.4决定何时将函数声明成内联223

8.2.5使用内联lambda管理资源223

8.3高阶函数中的控制流225

8.3.1lambda中的返回语句:从一个封闭的函数返回225

8.3.2从lambda返回:使用标签返回226

8.3.3匿名函数:默认使用局部返回228

8.4小结229

9泛型231

9.1泛型类型参数232

9.1.1泛型函数和属性232

9.1.2声明泛型类234

9.1.3类型参数约束235

9.1.4让类型形参非空237

9.2运行时的泛型:擦除和实化类型参数238

9.2.1运行时的泛型:类型检查和转换238

9.2.2声明带实化类型参数的函数241

9.2.3使用实化类型参数代替类引用243

9.2.4实化类型参数的限制244

9.3变型:泛型和子类型化245

9.3.1为什么存在变型:给函数传递实参245

9.3.2类、类型和子类型246

9.3.3协变:保留子类型化关系248

9.3.4逆变:反转子类型化关系252

9.3.5使用点变型:在类型出现的地方指定变型254

9.3.6星号投影:使用*代替类型参数257

9.4小结261

10注解与反射263

10.1声明并应用注解264

10.1.1应用注解264

10.1.2注解目标265

10.1.3使用注解定制JSON序列化267

10.1.4声明注解269

10.1.5元注解:控制如何处理一个注解270

10.1.6使用类做注解参数271

10.1.7使用泛型类做注解参数272

10.2反射:在运行时对Kotlin对象进行自省273

10.2.1Kotlin反射API:KClass、KCallable、KFunction和

KProperty274

10.2.2用反射实现对象序列化278

10.2.3用注解定制序列化279

10.2.4JSON解析和对象反序列化283

10.2.5反序列化的最后一步:callBy()和使用反射创建对象287

10.3小结291

11DSL构建293

11.1从API到DSL293

11.1.1领域特定语言的概念295

11.1.2内部DSL296

11.1.3DSL的结构297

11.1.4使用内部DSL构建HTML298

11.2构建结构化的API:DSL中带接收者的lambda299

11.2.1带接收者的lambda和扩展函数类型299

11.2.2在HTML构建器中使用带接收者的lambda303

11.2.3Kotlin构建器:促成抽象和重用307

11.3使用“invoke”约定构建更灵活的代码块嵌套310

11.3.1“invoke”约定:像函数一样可以调用的对象310

11.3.2“invoke”约定和函数式类型311

11.3.3DSL中的“invoke”约定:在Gradle中声明依赖312

11.4实践中的KotlinDSL314

11.4.1把中缀调用链接起来:测试框架中的“should”314

11.4.2在基本数据类型上定义扩展:处理日期316

11.4.3成员扩展函数:为SQL设计的内部DSL317

11.4.4Anko:动态创建AndroidUI320

11.5小结322

A构建Kotlin项目323

BKotlin代码的文档化327

精彩书摘

  译者序

  当收到这《Kotlin实战》的翻译邀请时,我们的内心是激动的,终于有机会将自己喜爱的语言系统地介绍给中国的开发者,而且是通过口碑颇佳的实战系列。此时,正值2017年度的GoogleI/O召开前夕,接下来重磅消息大家都知道了:在GoogleI/O大会上,Kotlin正式成为了官方的Android开发语言,迅速占据了国内各大技术媒体的头条。一夜之间,所有的Android开发者都迫切地想搞清楚它的来龙去脉。Kotlin究竟是何方神圣,为什么是它?

  这一点儿也不奇怪。对于资深Android开发者来说,Kotlin早已不是新鲜的概念了。早在2015年1月,Android开发者社区大神JakeWharton就发布了一篇使用Kotlin来进行Android开发的总结。那时开始,不少顶尖的开发者和公司就开始尝试在正式的Android项目中使用Kotlin语言;我们也从2015年开始在多个项目上使用了Kotlin语言。它带给我们的体验,和带给所有其他实践过Kotlin语言的开发者的一样:它的发明者JetBrains所言非虚,这是一门简洁、安全、实用的语言,用了就停不下来,就忍不住地想推荐给周围的人。我们理所当然地把Kotlin放在了今年第一季度ThoughtWorks技术雷达的评估象限:https://www.thoughtworks.com/radar/languages-and-frameworks/kotlin。

  Kotlin让人爱不释手的最重要原因就是来自JetBrains的基因。作为最负盛名的IDE创造者,JetBrains深谙开发者的需求,孜孜不倦地追求给开发者提供最实用、最高效的IDE,包括AndroidStudio、IntelliJ、RubyMine等。由这样想开发者之所想的公司创造出来的语言,又怎么会不受开发者热捧呢?所以Gradle、Spring,以及越来越多的库、框架和工具也陆续加入到了支持Kotlin的阵营。

  《Kotlin实战》深入浅出地介绍了Kotlin语言的方方面面,从最基础的语言要素到如何定制自己的DSL都有涉及。相信读者阅读《Kotlin实战》并尝试之后一定会爱上这门语言,但把Kotlin应用到自己的项目中会不会有什么风险呢?读者们大可不必担心,以往的经验告诉我们,整个过程无缝无痛。首先,Kotlin足够简单,对于初学者来说掌握也不算困难,两三天就可以上手;其次,Kotlin和Java可以无缝地衔接,可以在遗留项目上和Java混用;最后,编译器的静态检查和IDE(必须是JetBrains出品的IntelliJIDEA或者AndroidStudio)强大的辅助功能,可以帮你发现很多问题(例如空指针异常)并将其自动消除在摇篮之中。有的读者会说,但我还没有用过这些IDE啊?那你还在犹豫什么,请立即使用它们来提高你的生产力吧!这也算是使用Kotlin带来的额外收获。

  从Kotlin成为Android开发语言的那一刻开始,我们热情高涨地投入了几乎全部业余时间到《Kotlin实战》的翻译工作,终于在最短的时间内把它呈现在广大读者面前。这一切还要感谢《Kotlin实战》的编辑和所有译者家人在背后的默默付出。由于译者水平所限,难免出现谬误遗漏,还望读者海涵斧正。

  覃宇、罗丽、李思阳、蒋扬海

  2017年6月于ThoughtWorks成都

  序

  当我在2010年春季第一次拜访JetBrains的时候,我相当确定世界上不需要另一种通用编程语言了。我认为现有的JVM上的语言已经足够好了,谁会有想法去创建一门新语言呢?在经过大约一个小时的关于大规模代码库上产品问题的讨论后我被完全说服了,并且后来成为Kotlin一部分的最初想法就已经被描绘在白板上。很快我就加入了JetBrains来主导这门语言的设计与编译器的开发工作。

  到今天,六年多的时光过去了,我们也快要发布第二个版本。我们已经拥有超过30人的团队和数以千计的活跃用户,还有很多让我们难以轻易实现的精彩的设计理念。但是不要担心,这些想法在进入这门语言之前还必须经过缜密的考察。我们希望这《Kotlin实战》的篇幅依然能够容得下Kotlin的未来。

  学习一门编程语言是一个令人兴奋而且常常是回报颇丰的尝试。如果它是你的第一门语言,通过它你能学到整个编程的新世界。如果不是,它会使你以新的术语来思考熟悉的东西,从而以更高层次的抽象来更深入地了解它们。《Kotlin实战》主要针对后者,即面向已经熟悉Java的读者。

  从头开始设计一门语言可能是一项具有挑战性的任务,但是使其与另一门语言融洽的工作就是另一回事了——尤其是那门语言还包含了许多的愤怒的食人魔,以及一些阴暗的地牢(在这一点上你如果不相信可以去问C++的创造者BjarneStroustrup)。与Java的互操作性(这就是Java与Kotlin之间是如何互相混合调用的)是Kotlin的基石之一,《Kotlin实战》也投入了很多的注意力在这一点上。互操作性对于在一个已有的Java代码库中逐步地引入Kotlin非常重要。即使从头开始开发一个新项目时,也必须考虑到能够将这门语言融入一个拥有更大图景的平台中去,而以Java编写的所有函数库就是这样的一个平台。

  当我在编写《Kotlin实战》时,两个新的目标平台正在开发:Kotlin现在可以在JavaScript虚拟机上运行以支持全栈web开发,并且还将很快能够直接编译成原生代码,从而在需要的时候能够脱离任何的虚拟机来运行。1所以,虽然《Kotlin实战》是面向JVM的,但是你从中学到的很多东西也是可以应用于其他运行环境的。

  《Kotlin实战》作者从项目伊始就已经是Kotlin团队的成员,所以他们对语言本身和内部实现非常熟悉。他们在会议演讲、研讨会及Kotlin课程方面的经验使他们能够对预期的常见问题及可能的陷阱,提供良好的阐述。《Kotlin实战》既阐释了语言特征背后的高级概念,也提供了足够深入的细节。

  希望你能享受与我们的语言及《Kotlin实战》相处的时光。正如我经常在我们社区的帖子中说的那样:使用Kotlin愉快!

  ANDREYBRESLAV,JetBrainsKotlin首席设计师

前言/序言

  关于Kotlin想法的构思2010年诞生于JetBrains。当时,JetBrains已经是许多程序语言开发工具的知名供应商,包括Java、C#、JavaScript、Python、Ruby和PHP。JavaIDE——IntelliJIDEA,Groovy和Scala的插件,都是我们的旗舰产品。

  为各种程序语言构建开发工具的经验给了我们对语言设计领域全面的理解和独特的观点。而基于IntelliJ平台的IDE,包括IntelliJIDEA,仍然是用Java开发的。我们甚至都有点羡慕在.NET团队中的同事,他们使用C#,一种现代、强大、迅速进化的语言进行开发。但是我们没有看到任何一种可以用来取代Java的语言。

  对于这样的一门语言我们有哪些要求呢?首要而且最明确的要求就是它必须是静态类型的。我们想象不到其他任何一种——开发一个拥有数百万行代码的代码库许多年后——还不把人逼疯的办法。其次,我们需要与现有的Java代码完全兼容。这样的代码库是JetBrains的一笔巨大财富,我们承受不起失去它或是因为互操作性的难度而使其贬值的损失。再次,我们不愿意在工具质量方面接受任何的妥协。开发者的生产力是JetBrains作为一个公司最重要的价值,而强大的工具是达到这一目的的必要条件。最后,我们需要的是一种易于学习和理解的语言。

  当看到一个我们公司未能满足的需要时,我们知道其他公司也处在一个相似的境地,我们希望我们的解决方案能够在JetBrains之外找到许多用户。带着这样的初心,我们决定走上一条创建一门新语言:Kotlin的道路。事实上,这个项目花费了超出我们预期的时间,在Kotlin1.0最终诞生时,距离第一行代码提交到代码库中已经过去了超过五年;但是现在我们可以确信,这门语言找到了它的受众并且这些人都留了下来。

  Kotlin以靠近俄罗斯圣彼得堡的一座岛屿命名,Kotlin的大部分开发团队就在那里。在使用岛屿命名这件事上,我们遵循了Java和Ceylon确立的先例,但我们决定选用一处靠近我们家乡的地方(在英语中,这个名称通常的发音是“cot-lin”,而不是“coat-lin”或者“caught-lin”)。

  在这门语言临近发布之际,我们意识到一本由参与了语言设计决策人员撰写的关于Kotlin的书籍是有价值的,他们可以自信地解释为什么Kotlin中的事物是以它们的方式运行的。《Kotlin实战》就是这种努力的结果,我们希望它能帮助你学习和理解Kotlin语言。祝你好运,并愿你一直能愉快地进行开发。

  关于《Kotlin实战

  《Kotlin实战》会教你Kotlin编程语言,以及如何使用它构建运行在Java虚拟机和Android平台的应用程序。这《Kotlin实战》开始部分讲解了这门语言的基本特性,并逐渐覆盖更多Kotlin与众不同的方面,比如它对构建高级抽象和领域特定语言的支持。

  这《Kotlin实战》很注重将Kotlin与已有的Java工程的集成,帮助你将Kotlin引入到你现在的工作环境。这《Kotlin实战》涵盖了Kotlin1.0,在编写这《Kotlin实战》的同时Kotlin1.1已经在开发过程中了,所以在一些可能的地方,我们提示了1.1版本中做出的更改。但是由于在写这《Kotlin实战》的时候新的版本还没有完成,我们并不能在书中包含所有的内容。对于进行中的新特性和改变的更新,请参考线上的官方文档https://kotlinlang.org。

  哪些人应该阅读这《Kotlin实战

  《Kotlin实战》主要面向有一定Java经验的开发者。Kotlin的构建基于Java中的许多概念和技术,这《Kotlin实战》争取通过使用你现有的知识快速上手。如果你只是刚开始学习Java,又或者你有诸如C#或者JavaScript这些编程语言的经验,你可能需要参考其他的信息源以理解Kotlin中与JVM交互的那些错综复杂的方面,但你还是可以通过这《Kotlin实战》学习Kotlin。我们致力于将Kotlin打造成全领域语言,而不是只针对某些特定的问题领域,所以这《Kotlin实战》同样对服务端、Android,以及其他任何以构建基于JVM的工程为目标的开发人员都有用。

  这《Kotlin实战》是如何组织的

  这《Kotlin实战》被分成了两个部分。第1部分解释了如何开始使用Kotlin现有的库和API:

  第1章讲述了Kotlin的关键目标、价值和应用的领域,它将向你展示运行Kotlin代码的所有可能的途径。

  第2章解释了Kotlin编程的基本元素,包括控制结构、变量和函数声明。

  第3章讲解了Kotlin中关于函数声明的细节并介绍了扩展函数和扩展属性的概念。

  第4章集中在类的声明上,并介绍了数据类和伴生对象的概念。

  第5章介绍了Kotlin中lambda的使用并展示了一些Kotlin标准库中使用lambda的函数。

  第6章描述Kotlin的数据类型系统,并特别关注了可空性和集合的话题。

  第2部分会教你如何使用Kotlin构建你自己的API和抽象,并涵盖了这门语言的一些深层次的特性。

  第7章讲到了约定原则,它利用特定的名字赋予函数和属性特殊的意义,还介绍了委托属性的概念。

  第8章展示了如何声明高阶函数——以其他函数作为参数或者返回值的函数,还介绍了内联函数的概念。

  第9章深入探讨Kotlin中泛型的话题,先讲了基本语法然后是更高级的领域,比如实化类型参数和变型。

  第10章包括注解和反射的使用,并以JKid为中心。JKid是大量使用了这些概念的一个小而真实的JSON序列化库。

  第11章介绍了领域特定语言的概念,描述用来构建它的Kotlin工具,并演示了许多DSL示例。

  还有三个附录。附录A说明了如何用Gradle、Maven和Ant构建Kotlin代码;附录B着重于编写文件注释和为Kotlin模块生成API文档;附录C是一个探索Kotlin生态圈和发现最新的在线信息的指南。

  最好是按顺序通读《Kotlin实战》,但是也完全可以只查阅感兴趣的包含特定主题的单个章节,在遇到不熟悉的概念的时候再参考其他章节。


其他推荐