书籍作者:Dmitry | ISBN:9787121321580 |
书籍语言:简体中文 | 连载状态:全集 |
电子书格式:pdf,txt,epub,mobi,azw3 | 下载次数:8369 |
创建日期:2021-02-14 | 发布日期:2021-02-14 |
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板 |
《Kotlin实战》将从语言的基本特性开始,逐渐覆盖其更多的高级特性,尤其注重讲解如何将 Koltin 集成到已有 Java 工程实践及其背后的原理。《Kotlin实战》分为两个部分。第一部分讲解如何开始使用 Kotlin 现有的库和API,包括基本语法、扩展函数和扩展属性、数据类和伴生对象、lambda 表达式,以及数据类型系统(着重讲解了可空性和集合的概念)。第二部分教你如何使用 Kotlin 构建自己的 API,以及一些深层次特性——约定和委托属性、高阶函数、泛型、注解和反射,以及领域特定语言的构建。本书适合广大移动开发者及入门学习者,尤其是紧跟主流趋势的前沿探索者。
原著作者简介
??本书作者为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 语言来开发达到产品级品质的应用。《Kotlin 实战》为具备一定 Java 经验的开发者编写,包含了丰富的示例,和大多数介绍编程语言的书籍相比更加深入,涵盖了非常有趣的话题,例如怎样构建使用自然语言语法的 DSL。两位作者是 Kotlin 的核心开发者,所以你完全可以相信《Kotlin 实战》中细枝末节的内容都无比地精确。
● 在 JVM 上进行函数式编程
● 编写整洁并符合语义习惯的代码
● 结合运用 Kotlin 和 Java
● 领域特定语言
关于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编程语言,以及如何使用它构建运行在Java虚拟机和Android平台的应用程序。这本书开始部分讲解了这门语言的基本特性,并逐渐覆盖更多Kotlin与众不同的方面,比如它对构建高级抽象和领域特定语言的支持。
这本书很注重将Kotlin与已有的Java工程的集成,帮助你将Kotlin引入到你现在的工作环境。这本书涵盖了Kotlin1.0,在编写这本书的同时Kotlin1.1已经在开发过程中了,所以在一些可能的地方,我们提示了1.1版本中做出的更改。但是由于在写这本书的时候新的版本还没有完成,我们并不能在书中包含所有的内容。对于进行中的新特性和改变的更新,请参考线上的官方文档https://kotlinlang.org。
哪些人应该阅读这本书
《Kotlin实战》主要面向有一定Java经验的开发者。Kotlin的构建基于Java中的许多概念和技术,这本书争取通过使用你现有的知识快速上手。如果你只是刚开始学习Java,又或者你有诸如C#或者JavaScript这些编程语言的经验,你可能需要参考其他的信息源以理解Kotlin中与JVM交互的那些错综复杂的方面,但你还是可以通过这本书学习Kotlin。我们致力于将Kotlin打造成全领域语言,而不是只针对某些特定的问题领域,所以这本书同样对服务端、Android,以及其他任何以构建基于JVM的工程为目标的开发人员都有用。
这本书是如何组织的
这本书被分成了两个部分。第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生态圈和发现最新的在线信息的指南。
最好是按顺序通读本书,但是也完全可以只查阅感兴趣的包含特定主题的单个章节,在遇到不熟悉的概念的时候再参考其他章节。
第 1 部分 Kotlin 简介1
1 Kotlin :定义和目的3
1.1 Kotlin 初体验3
1.2 Kotlin 的主要特征4
1.2.1 目标平台 :服务器端、Android 及任何 Java 运行的地方4
1.2.2 静态类型5
1.2.3 函数式和面向对象6
1.2.4 免费并开源7
1.3 Kotlin 应用8
1.3.1 服务器端的 Kotlin8
1.3.2 Android 上的 Kotlin9
1.4 Kotlin 的设计哲学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.2 IntelliJ IDEA 和 Android Studio 插件15
1.5.3 交互式 shell15
1.5.4 Eclipse 插件15
1.5.5 在线 playground15
1.5.6 Java 到 Kotlin 的转换器16
1.6 小结16
2 Kotlin 基础17
2.1 基本要素 :函数和变量17
2.1.1 Hello,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.3 Kotlin 源码布局 :目录和包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.5 Kotlin 中的异常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.1 Kotlin 中的接口70
4.1.2 open、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
5 Lambda 编程105
5.1 Lambda 表达式和成员引用105
5.1.1 Lambda 简介 :作为函数参数的代码块106
5.1.2 Lambda 和集合107
5.1.3 Lambda 表达式的语法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.3 groupBy :把列表转换成分组的 map119
5.2.4 flatMap 和 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.2 SAM 构造方法 :显式地把 lambda 转换成函数式接口129
5.5 带接收者的 lambda :“with”与“apply”131
5.5.1 “with”函数131
5.5.2 “apply”函数133
5.6 小结135
6 Kotlin 的类型系统137
6.1 可空性137
6.1.1 可空类型138
6.1.2 类型的含义140
6.1.3 安全调用运算符 :“?:”141
6.1.4 Elvis 运算符 :“?:”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.5 Unit 类型 :Kotlin 的“void”163
6.2.6 Nothing 类型 :“这个函数永不返回”164
6.3 集合与数组164
6.3.1 可空性和集合165
6.3.2 只读集合与可变集合167
6.3.3 Kotlin 集合和 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.3 rangeTo 的约定191
7.3.4 在“for”循环中使用“iterator”的约定192
7.4 解构声明和组件函数193
7.4.1 解构声明和循环194
7.5 重用属性访问的逻辑 :委托属性195
7.5.1 委托属性的基本操作196
7.5.2 使用委托属性 :惰性初始化和“by lazy()”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.1 lambda 中的返回语句 :从一个封闭的函数返回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.1 Kotlin 反射 API :KClass、KCallable、KFunction 和
KProperty274
10.2.2 用反射实现对象序列化278
10.2.3 用注解定制序列化279
10.2.4 JSON 解析和对象反序列化283
10.2.5 反序列化的最后一步 :callBy() 和使用反射创建对象287
10.3 小结291
11 DSL 构建293
11.1 从 API 到 DSL293
11.1.1 领域特定语言的概念295
11.1.2 内部 DSL296
11.1.3 DSL 的结构297
11.1.4 使用内部 DSL 构建 HTML298
11.2 构建结构化的 API:DSL 中带接收者的 lambda299
11.2.1 带接收者的 lambda 和扩展函数类型299
11.2.2 在 HTML 构建器中使用带接收者的 lambda303
11.2.3 Kotlin 构建器 :促成抽象和重用307
11.3 使用“invoke”约定构建更灵活的代码块嵌套310
11.3.1 “invoke”约定 :像函数一样可以调用的对象310
11.3.2 “invoke”约定和函数式类型311
11.3.3 DSL 中的“invoke”约定 :在 Gradle 中声明依赖312
11.4 实践中的 Kotlin DSL314
11.4.1 把中缀调用链接起来 :测试框架中的“should”314
11.4.2 在基本数据类型上定义扩展 :处理日期316
11.4.3 成员扩展函数 :为 SQL 设计的内部 DSL317
11.4.4 Anko :动态创建 Android UI320
11.5 小结322
A 构建 Kotlin 项目323
B Kotlin 代码的文档化327