¥ 20.07 2.3折 ¥ 89 九品
仅1件
作者覃宇、罗丽、李思阳、蒋扬海 译
出版社电子工业出版社
出版时间2017-08
版次1
装帧平装
货号A1
上书时间2024-11-03
《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技术动向有着敏锐的洞察力。
第 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
— 没有更多了 —
以下为对购买帮助不大的评价