新書推薦:
《
中国王朝内争实录(套装全4册):从未见过的王朝内争编著史
》
售價:NT$
1112.0
《
半导体纳米器件:物理、技术和应用
》
售價:NT$
806.0
《
创客精选项目设计与制作 第2版 刘笑笑 颜志勇 严国陶
》
售價:NT$
281.0
《
佛山华家班粤菜传承 华家班59位大厨 102道粤菜 图文并茂 菜式制作视频 粤菜故事技法 佛山传统文化 广东科技
》
售價:NT$
1010.0
《
武人琴音(十周年纪念版 逝去的武林系列收官之作 形意拳一门三代:尚云祥、韩伯言、韩瑜的人生故事 凸显百年武人命运)
》
售價:NT$
199.0
《
剑桥斯堪的纳维亚戏剧史(剑桥世界戏剧史译丛)
》
售價:NT$
704.0
《
禅心与箭术:过松弛而有力的生活(乔布斯精神导师、世界禅者——铃木大拙荐)
》
售價:NT$
301.0
《
先进电磁屏蔽材料——基础、性能与应用
》
售價:NT$
1010.0
編輯推薦:
Kotlin是一种高度简洁、优雅、流畅和富有表现力的﹑静态类型的多范式语言。它是为数不多的可同时编译成Java字节码和JavaScript的语言之一。谷歌也将其作为Android开发的一流语言。使用Kotlin,你可以混合使用命令式、函数式和面向对象的编程风格,并从适合当前问题的方法中获益。你可以用它来构建服务器端、前端以及Android应用程序。而且完成任务所需的代码更少,同时又可以保证代码类型安全且更不容易出错。
【为什么要选择本书】
阅读本书,不仅可以通过易于理解的示例学习使用Kotlin语言的许多特性,还可以学习编写易于维护、高性能的JVM和Android应用程序,创建DSL和异步编程等。
本书会带你使用你喜欢的IDE并利用大量示例和练习来提高你的Kotlin技能。你将学习创建独立的小程序并以脚本的形式运行,创建类型安全的代码,然后将这些知识进一步拓展,以创建易于扩展的﹑完全面向对象的﹑函数式风格的代码。还将学习如何在不影响效率或性能的情况下优雅地编程,以及如何使用元编程来创建高度富有表现力的代码,并创建利用语言流畅性优势的内部DSL。与此同时,你也会学习协程、异
內容簡介:
本书面向程序员、开发主管、架构师和技术经理。假定读者熟悉编程的基础知识,同时也假定读者对Java和JDK有一定的了解。
第I部分主要介绍使用Kotlin编写脚本。
第II部分是关于面向对象的编程。
第III部分,你将学习如何使用该语言的函数风格的功能。
第IV部分将把目前为止所学的知识结合起来,使你的代码更加流畅,并教会你如何创建内部领域特定语言(DSL)。
在第V部分中,你将了解新的协程和异步编程。
第VI部分涉及Java的互操作、测试、使用带有Spring的Kotlin,以及使用Kotlin编写Android应用程序。
關於作者:
Venkat Subramaniam博士是一位获奖作家,Agile Developer公司的创始人,休斯敦大学的教学型教授。他在北美洲、欧洲和亚洲培训和指导了数千名软件开发人员,并定期应邀在国际会议上发言。他是多本书的作者(合著者),包括2007年获得Jolt Productivity奖的Practices of an Agile Developer一书。
目錄 :
第1章 你好Kotlin1
1.1 爱上Kotlin的理由2
1.1.1 多范式编程3
1.1.2 具有类型推断的静态类型4
1.2 为什么选择Kotlin5
1.3 带Kotlin去兜兜风5
1.3.1 安装Kotlin SDK6
1.3.2 验证安装6
1.4 编译成字节码并运行7
1.4.1 在命令行上运行7
1.4.2 在IDE中运行8
1.4.3 使用REPL进行实验8
1.4.4 作为脚本运行9
1.5 编译成其他目标11
1.6 选择哪个选项11
1.7 本章小结12
【第一部分 使用Kotlin编写脚本】
第2章 从Java角度了解Kotlin的基本知识14
2.1 减少输入15
2.1.1 分号是可选的15
2.1.2 变量类型规范是可选的15
2.1.3 类和函数是可选的17
2.1.4 try-catch是可选的18
2.2 合理的警告19
2.3 选择val而不是var20
2.4 改进的相等性检查21
2.5 字符串模板23
2.6 原始字符串24
2.6.1 没有转义24
2.6.2 多行字符串24
2.7 更多的表达式,更少的语句26
2.8 本章小结28
第3章 使用函数29
3.1 创建函数30
3.1.1 KISS函数30
3.1.2 返回类型和类型推断30
3.1.3 所有的函数都是表达式31
3.1.4 定义参数32
3.1.5 带有块体的函数33
3.2 默认参数和命名参数34
3.2.1 演化带有默认参数的函数34
3.2.2 使用命名参数提高可读性35
3.3 vararg和spread37
3.3.1 可变数量的实参37
3.3.2 spread运算符38
3.4 解构39
3.5 本章小结40
第4章 外部迭代和参数匹配42
4.1 范围与迭代43
4.1.1 范围类43
4.1.2 正向迭代43
4.1.3 反向迭代44
4.1.4 跳过范围内的值44
4.2 遍历数组和列表45
4.3 何时应该使用when47
4.3.1 when用作表达式47
4.3.2 when用作语句49
4.3.3 when和变量的作用域49
4.4 本章小结50
第5章 使用集合51
5.1 集合的类型51
5.1.1 Kotlin所添加的便利方法52
5.1.2 视图53
5.2 使用Pair和Triple53
5.3 对象和基元数组55
5.4 使用列表56
5.5 使用集合59
5.6 使用映射59
5.7 本章小结61
第6章 使用类型安全性解决问题63
6.1 Any和Nothing类64
6.1.1 Any是基类64
6.1.2 Nothing比void更深入65
6.2 可空的引用65
6.2.1 null是件不好的事66
6.2.2 使用可空类型67
6.2.3 安全调用运算符69
6.2.4 Elvis运算符69
6.2.5 不要使用不安全的断言运算符70
6.2.6 使用when71
6.3 类型检查和转换72
6.3.1 类型检查72
6.3.2 使用is72
6.3.3 智能转换73
6.3.4 使用带有when的类型检查和智能转换75
6.4 显式类型转换75
6.5 泛型:参数类型的变化和约束77
6.5.1 类型不变性77
6.5.2 使用协变79
6.5.3 使用逆变81
6.5.4 使用where的参数类型约束82
6.5.5 星投影83
6.6 具体化的类型参数84
6.7 本章小结86
【第二部分 面向对象的Kotlin】
第7章 对象和类88
7.1 对象和单例88
7.1.1 带有对象表达式的匿名对象89
7.1.2 带有对象声明的单例91
7.1.3 顶级函数与单例92
7.2 创建类93
7.2.1 最小的类94
7.2.2 只读属性94
7.2.3 创建实例94
7.2.4 读写属性95
7.2.5 底层探秘—字段和属性95
7.3 伴生对象和类成员102
7.3.1 类级别成员102
7.3.2 访问同伴103
7.3.3 Companion作为Factory103
7.3.4 不是非常静态的104
7.4 创建泛型类105
7.5 数据类106
7.6 本章小结108
第8章 类层次结构和继承110
8.1 创建接口和抽象类110
8.1.1 创建接口111
8.1.2 创建抽象类113
8.1.3 是接口还是抽象类113
8.2 嵌套类和内部类114
8.3 继承116
8.4 Sealed类119
8.5 创建和使用枚举120
8.6 本章小结122
第9章 通过委托进行扩展124
9.1 何时选择委托而不是继承125
9.2 使用委托进行设计126
9.2.1 一个设计问题126
9.2.2 继承的错误指向127
9.2.3 委托—艰难的方式128
9.2.4 使用Kotlin的by来进行委托129
9.3 委托给一个参数130
9.4 处理方法冲突131
9.5 Kotlin委托的注意事项133
9.6 委托变量和属性135
9.6.1 委托变量135
9.6.2 委托属性137
9.7 内置的标准委托139
9.7.1 有点儿懒惰也没关系140
9.7.2 Observable委托141
9.7.3 行使你的可否决权利142
9.8 本章小结143
【第三部分 函数式Kotlin】
第10章 使用lambda进行函数式编程146
10.1 函数式风格146
10.1.1 什么是函数式风格147
10.1.2 为什么以及何时使用函数式风格148
10.2 lambda表达式149
10.2.1 lambda的结构149
10.2.2 传递lambda150
10.2.3 使用隐式参数151
10.2.4 接收lambda151
10.2.5 用lambda作为最后一个参数151
10.2.6 使用函数引用152
10.2.7 函数返回函数154
10.3 lambda和匿名函数155
10.4 闭包和词法作用域157
10.5 非局部和带标签的return158
10.5.1 默认情况下不允许使用return 158
10.5.2 带标签的return159
10.5.3 非局部return161
10.6 带有lambda的内联函数163
10.6.1 默认情况下没有内联优化163
10.6.2 内联优化164
10.6.3 对参数精心选择noinline 165
10.6.4 内联lambda中允许非局部return166
10.6.5 crossinline参数167
10.6.6 inline和return的良好实践168
10.7 本章小结169
第11章 内部迭代和延迟计算170
11.1 外部迭代器与内部迭代器171
11.2 内部迭代器172
11.2.1 filter、map和reduce172
11.2.2 得到第一个和最后一个174
11.2.3 flatten和flatMap175
11.2.4 排序177
11.2.5 将对象进行分组177
11.3 延迟计算序列178
11.3.1 使用序列提高性能179
11.3.2 无限序列181
11.4 本章小结183
【第四部分 优雅且高效的Kotlin】
第12章 Kotlin的流畅性186
12.1 重载运算符187
12.2 使用扩展函数和属性进行注入190
12.2.1 使用扩展函数注入方法190
12.2.2 使用扩展函数注入运算符191
12.2.3 使用扩展属性注入属性192
12.2.4 注入第三方类192
12.2.5 注入静态方法195
12.2.6 从类内注入195
12.3 扩展函数197
12.4 带中缀的函数流畅性198
12.5 带Any对象的流畅性199
12.5.1 四种方法的行为200
12.5.2 来自冗长和混乱的代码201
12.5.3 使用apply删除重复的引用202
12.5.4 使用run获得结果203
12.5.5 使用let将对象作为参数传递203
12.5.6 使用also将void函数链接起来205
12.6 隐式接收方206
12.6.1 传递一个接收方206
12.6.2 带接收方的多个作用域207
12.7 本章小结209
第13章 创建内部DSL210
13.1 DSL的类型和特征211
13.1.1 外部DSL与内部DSL211
13.1.2 语境驱动和流畅211
13.2 用于内部DSL的Kotlin211
13.2.1 分号可选212
13.2.2 点和圆括号不与中缀在一起212
13.2.3 使用扩展函数获得特定的域212
13.2.4 传递lambda不需要圆括号213
13.2.5 隐式接收方影响DSL的创建213
13.2.6 还有一些特性可以帮助DSL214
13.3 构建流畅性方面的挑战214
13.3.1 使用扩展函数215
13.3.2 使用接收方和中缀216
13.4 类型安全构建器220
13.4.1 HTML构建器220
13.4.2 XML构建器222
13.5 使用作用域控制来缩小访问范围225
13.6 本章小结227
第14章 编写递归和记忆228
14.1 递归的威力和危险228
14.2 尾调用优化230
14.3 记忆232
14.3.1 重复计算233
14.3.2 记忆—Kotlin中的Groovy方法234
14.3.3 记忆作为委托235
14.4 将记忆应用于动态规划237
14.5 本章小结238
【第五部分 编写异步应用程序】
第15章 探索协程242
15.1 协程和并发242
15.1.1 并行与并发243
15.1.2 协程作为协作函数243
15.2 使用协程并发运行244
15.2.1 从顺序执行开始244
15.2.2 创建一个协程245
15.2.3 启动一个任务246
15.2.4 与挂起点交错调用247
15.3 协程上下文和线程249
15.3.1 显式设置上下文249
15.3.2 在自定义池中运行250
15.3.3 在挂起点后切换线程251
15.3.4 修改CoroutineContext253
15.4 调试协程254
15.4.1 async 和await255
15.4.2 看一眼延续256
15.5 创建无限序列258
15.5.1 使用序列258
15.5.2 使用iterator函数259
15.6 本章小结261
第16章 异步编程262
16.1 非阻塞异步编程262
16.1.1 按顺序开始262
16.1.2 进行异步264
16.2 异常处理266
16.2.1 启动和异常266
16.2.2 异步和异常268
16.3 取消和超时270
16.3.1 取消协程270
16.3.2 请勿打扰273
16.3.3 双向取消274
16.3.4 监督作业275
16.3.5 编程时使用超时276
16.4 本章小结277
【第六部分 互操作和测试】
第17章 将Java与Kotlin混合使用280
17.1 联合编译280
17.2 从Kotlin调用Java283
17.3 从Java调用Kotlin286
17.3.1 使用Java中的重载运算符287
17.3.2 创建静态方法288
17.3.3 传递lambda289
17.3.4 添加throws子句290
17.3.5 使用带默认参数的函数292
17.3.6 访问顶级函数293
17.3.7 更多注释294
17.4 本章小结294
第18章 使用Kotlin进行单元测试296
18.1 被测试的代码296
18.2 获取项目文件297
18.2.1 设置Gradle298
18.2.2 设置Maven300
18.3 从Canary测试开始300
18.4 编写经验测试301
18.5 编写数据驱动的测试304
18.6 模拟依赖项305
18.6.1 创建交互测试306
18.6.2 测试解析数据308
18.7 测试顶级函数310
18.8 测试协程和异步调用313
18.9 与服务集成316
18.10 查看代码覆盖率317
18.11 将应用程序用于驱动318
18.12 本章小结319
第19章 使用Kotlin编写Spring应用程序320
19.1 创建一个Starter项目320
19.2 创建一个控制器322
19.3 创建一个实体类324
19.4 创建一个存储库接口325
19.5 创建一个服务326
19.6 将服务与控制器集成327
19.7 继续实践329
19.8 本章小结330
第20章 使用Kotlin编写Android应用程序331
20.1 创建一个项目331
20.2 定义域对象333
20.3 创建布局335
20.4 实施活动337
20.5 更新RecyclerView341
20.6 查看应用程序的运行情况343
20.7 本章小结344
附录1 转换为JavaScript346
附录2 Kotlin/Native350
附录3 Kotlin到WebAssembly353
参考文献357
內容試閱 :
本书的目标读者
本书面向程序员、开发主管、架构师和技术经理。本书假定读者熟悉编程的基础知识,同时也假定读者对Java和JDK有一定的了解,但并没有假定读者对Kotlin有任何了解。如果你是一名Android程序员,本书会为你将来用Kotlin来为这些设备编程打下良好的基础,尽管本书并不是专门针对Android平台的。
如果你是Kotlin新手,本书将帮助你入门并快速地将该语言应用到你的项目中。如果你已经在使用Kotlin,可以使用本书来加深对该语言的一些高级特性的理解。
你还可以使用本书来培训你的开发人员,让他们精通Kotlin,用它来编写高度流畅和富于表现力的代码,并解决复杂的问题。
本书内容
Kotlin是一种多范式编程语言。你可以用Kotlin编写简单的脚本、面向对象的代码、函数式代码,以及异步编程等。为了合理地涵盖这一广泛的主题,本书分为多个部分。
第一部分主要介绍使用Kotlin编写脚本。第二部分是关于面向对象编程的。在第三部分中,你将学习如何使用该语言的函数式风格的功能。第四部分将把目前为止所学的知识结合起来,使代码更加流畅,并教会你如何创建内部领域特定语言(DSL)。在第五部分中,你将了解协程和异步编程。最后,第六部分涉及Java的互操作、测试、在Spring中使用Kotlin,以及使用Kotlin编写Android应用程序。
以下是每章所涵盖的内容。
在第1章中,我们将了解使用Kotlin的原因,下载必要的工具,并开始编写代码。
从Java转为Kotlin的程序员在开始学习Kotlin的新特性和不同之处之前,需要先忘却一些实践和语法。我们将在第2章介绍这些内容。
在Kotlin中,函数是“一等公民”,该语言提供了很多内容,比如默认参数、命名参数和可变参数。
第3章将探索这些与函数相关的功能。
在命令式编程中,我们经常使用外部迭代器。
第4章介绍Kotlin的迭代器如何使任务变得可以忍受,以及参数匹配语法如何从条件语句中消除大量的干扰。
我们在编程时广泛使用集合。
第5章将向你展示如何使用视图接口来处理Kotlin的JDK集合。
Kotlin有一个健全的类型系统,它的编译时类型检查超出了我们对静态类型语言的期望。
第6章将介绍Kotlin的基本类型、可空和不可空引用、智能类型转换等。
尽管在语义上是等价的,但在Kotlin中创建类与在Java中创建类是完全不同的。
第7章将学习创建单例、类、伴生对象,以及使用数据类的原因。
Kotlin处理继承的方式与Java中使用继承的方式有很大不同。默认情况下类是final的,并且该语言设置了一些规则来改进类型的安全性和编译时的检查。我们将在第8章中深入探讨这个主题。
作为直接支持委托的语言之一,Kotlin提供了一些内置的委托,并且使创建自定义委托变得更加容易。
第9章将首先讨论何时以及为何使用委托,然后深入讨论如何使用委托。
第10章将学习如何创建lambda表达式和编写高阶函数。我们还将介绍Kotlin提供的用来消除函数调用开销并提高性能的工具。
内部迭代器提供了流畅性,而序列给了我们效率。我们将在第11章中介绍对迭代和处理对象集合应用函数风格。
第12章将展示Kotlin用于创建简洁、流畅、优雅和富于表现力的代码的许多能力。
第13章介绍如何创建内部DSL,为你的专用语言定义你自己的语法。
Kotlin是JVM上为数不多的提供尾调用优化的语言之一。
我们将在第14章中看到它的实际应用,以及使用记忆来降低计算的复杂性。
协程是Kotlin 1.3中的一个稳定特性,它与延续一起为异步编程提供了基础架构。协程和延续的基础知识在第15章中进行介绍。
第16章介绍应用协程来创建实际的应用程序,这些应用程序可以从异步程序执行中获益。
Kotlin可以运行在不同的平台上,包括Java虚拟机。
在第17章中,你将学习如何将Kotlin与Java混合使用,如何在Java的现代版本中使用Kotlin—即使用Java模块,如何将其与Maven和Gradle一起使用,以及如何在同一个应用程序中顺利地使用Java和Kotlin。
尽管Kotlin编译器会捕获到一些错误,自动化测试对于可持续敏捷开发来说还是一个必不可少的实践。第18章介绍如何创建单元测试以及度量代码覆盖率。
第19章将探索面向Kotlin程序员的Spring库以及这些库所提供的独特功能。
最后,在第20章中,我们将使用Kotlin创建一个与后端服务对话的Android应用程序。
本书所使用的Kotlin和Java版本
要运行本书中的示例,需要Kotlin 1.3和Java 1.6或更高版本。尽管大多数示例也适用于早期版本的Kotlin,但有些示例需要使用Kotlin 1.3。Java互操作章节中的示例需要Java 9或更高版本。第1章会提供所需工具的下载说明。
如何阅读代码示例
本书中的大多数示例都是用Kotlin脚本编写的,因此你可以轻松地将它们作为单个文件运行,而无须显式编译。如果需要编译和其他步骤,会在代码旁边提供说明。
为了节省篇幅,我们会在println()命令的同一行或下一行上,将一段代码的输出显示为注释行。只有少量注释是用于说明代码的某些内容,而不是显示预期的输出。