编辑推荐
玩转Kotlin标准库,了解泛型的来龙去脉,避免错误使用lambda带来的尴尬,编写了不起的高阶函数。
内容简介
本书介绍了Kotlin的基本语法,常用类型,针对对象编程以及一些高阶的知识。
在所有的章节中,都广泛使用图片和会话的介绍方式,以帮助大脑更容易理解和获取信息。让你仿佛置身其中,更高效专注地学习知识,而把一些无关紧要的事情抛之脑后。
本书以某种“划重点”或“记笔记”的方式对某些内容或代码进行注解和说明,读者更容易知道内容和代码的重要部分。从而,有问必答解决的设计也十分准确,它会囊括一些在文中没有提及到,但你可能会疑惑的问题。
章节目录
版权信息
作者简介
引子 如何使用本书
1 开始
欢迎来到Kotlin之城
你几乎可以在任何地方使用Kotlin
本章内容
安装IntelliJ IDEA
构建一个基本的应用程序
构建一个基本的应用程序(继续)
构建一个基本的应用程序(继续)
你的第一个Kotlin项目
新增一个Kotlin文件
main函数剖析
将main函数添加至App.kt文件
你可以在main函数里面做些什么呢
循环
循环示例
条件分支
带有返回值的if语句
更新main函数
使用Kotlin的交互式shell
你可以在REPL中加入多行代码片段
Kotlin工具箱
2 基本类型和变量
你的代码需要变量
当你声明变量时会发生什么
变量保存了指向对象的引用
Kotlin的基本类型
如何显式声明变量类型
根据变量类型正确赋值
将一个变量值赋给另一个变量
类型转换
数值类型转换背后发生了什么
小心溢出
使用数组存放多个值
创建Phrase-O-Matic应用程序
向PhraseOMatic.kt中添加代码
编译器从数组中元素的值来推测数组的类型
var表示该变量可以指向不同数组
val表示该变量永远指向同一个数组
Kotlin工具箱
3 函数
我们一起来编写一个游戏“Rock、Paper、Scissors”
游戏设计概览
让程序选择一个选项
如何创建函数
可以向函数中传入多个值
可以从函数中返回一个值
单个表达式函数
向Game.kt中添加getGameChoice函数
getUserChoice函数
for循环工作原理
for循环工作原理(续)
询问用户的选择
验证用户的输入
更强大的布尔表达式(续)
向Game.kt中添加getUserChoice函数
向Game.kt中添加printResult函数
Game.kt代码(继续)
Kotlin工具箱
4 类和对象
使用类定义对象类型
如何设计自己的类
一起定义一个Dog类
如何创建Dog对象
如何访问属性及函数
创建一个Songs应用
神奇的对象创建
对象是如何创建的
现象背后:调用Dog构造函数
深入了解属性
灵活的属性初始化
如何使用初始化块
你必须初始化所有属性
如何验证属性值
如何编写自定义的getter
如何编写自定义的setter
Dog项目的完整代码
代码继续
Kotlin工具箱
5 子类和父类
继承帮助你避免代码重复
我们将要做什么
设计一个animal类继承结构
使用继承避免子类中的代码重复
子类应该覆盖什么
我们可以将一些动物分类
添加Canine和Feline类
使用IS-A测试类的层次结构
继承树中的任意子类都满足IS-A测试
创建一些Kotlin动物
使用open关键字声明父类及它的属性和方法
子类是如何继承父类的
如何(以及何时)覆盖属性
覆盖属性不仅仅让你可以指定默认值
如何覆盖方法
被覆盖的方法或属性仍然是open的
向Animals项目中添加Hippo类
添加Canine和Wolf类
哪个方法被调用了
当你调用方法时,变量指向对象的方法进行响应
你可以使用父类型作为方法的参数和返回值类型
更新后的Animals代码
更新后的Animals代码(续)
Kotlin工具箱
6 抽象类和接口
再谈Animal类的层次结构
一些类不能被实例化
抽象还是具体
抽象类可以有抽象属性和方法
Animal类有两个抽象方法
如何实现一个抽象类
你必须实现所有的抽象属性和方法
更新Animals项目
代码继续
代码继续
独立的类可以有共同的行为
接口可以让你在父类层次结构之外定义共同的行为
让我们定义Roamable接口
如何定义接口属性
声明一个类实现了一个接口
如何实现多个接口
如何决定是创建类、子类、抽象类还是接口
更新Animals项目
代码继续
代码继续
接口让你可以使用多态
在哪里使用is操作符
使用when将变量和一组选项进行比较
is操作符通常会进行智能转换
使用as进行显式转换
更新Animals项目
Kotlin工具箱
7 数据类
==调用了equals方法
equals继承自Any父类
Any类定义的共有行为
我们可能希望用equals检查两个对象是否等价
数据类允许你创建数据对象
数据类覆盖了它们继承的行为
使用copy方法复制数据对象
数据类定义了componentN方法
创建Recipes项目
生成的方法仅包含构造函数中定义的属性
初始化许多属性可能会导致烦琐的代码
如何在构造函数中设置默认值
方法也可以使用默认值
重载方法
更新Recipes项目
代码继续
Kotlin工具箱
8 空值和异常
从变量中删除对象引用
用空值删除一个对象引用
你可以在任何能够使用非可空类型的地方使用可空类型
创建一个可空类型的数组
访问可空类型的方法和属性
通过安全调用确保一切安全
链式安全调用
你可以使用安全调用赋值
如果变量的值不为空,使用let执行代码
对数组项使用let
替代if表达式
使用!!操作符故意抛出NullPointerException
创建Null Values项目
在异常情况下抛出异常
使用try/catch捕获异常
使用finally去做无论如何你都想做的事情
异常是Exception类型的对象
你可以显式地抛出异常
try和throw都是表达式
Kotlin工具箱
9 集合
有用的数组
数组不能处理的事情
Kotlin标准库
List、Set和Map
奇妙的List
创建MutableList
移除一个值
改变元素顺序以及批量更改
创建Collections项目
List允许重复项
如何创建Set
Set如何查重
哈希码与相等性
覆盖hashCode和equals的规则
如何使用MutableSet
复制MutableSet
更新Collections项目
Map的表演时间
如何使用Map
创建MutableMap
从MutableMap移除条目
拷贝Map和MutableMap
完整的Collections项目代码
Kotlin工具箱
10 泛型
泛型在集合中的使用
如何定义MutableList
在MutableList中使用类型参数
通过泛型类或接口可以做什么
接下来要做的事
创建Pet类的层次结构
定义Contest类
添加scores属性
创建getWinners方法
创建一些Contest对象
创建Generics项目
代码继续
Retailer层次结构
定义Retailer接口
轻松创建CatRetailer、DogRetailer和FishRetailer等对象
用out使泛型类型协变
更新Generics项目
代码继续
再定义一个Vet类
创建Vet对象
用in使泛型类型逆变
泛型类型的局部逆变
更新Generics项目
代码继续
代码继续
Kotlin工具箱
11 lambda和高阶函数
初识lambda
lambda的代码格式
将lambda赋值给变量
调用lambda时会发生什么
lambda表达式类型
lambda参数类型的自动解析
根据变量类型使用正确的lambda
创建Lambdas项目
将lambda作为函数参数
在函数体中调用lambda
代码运行时发生了什么
将lambda移到函数括号外面
更新Lambdas项目
函数可以返回一个lambda
将lambda作为函数参数和返回值
如何使用combine函数
用typealias为已存在的类型取别名
更新Lambdas项目
代码继续
Kotlin工具箱
12 内置高阶函数
Kotlin的内置高阶函数
用min和max函数处理基础类型
深入理解minBy和maxBy的lambda参数设置
sumBy与sumByDouble函数
创建Groceries项目
走近filter函数
使用map转换集合
代码运行时发生了什么
像for循环的forEach
forEach没有返回值
更新Groceries项目
代码继续
使用groupBy划分集合
在链式调用中使用groupBy
如何使用fold函数
fold函数背后的故事
再举几个fold函数的例子
更新Groceries项目
Kotlin工具箱
附录i 协程
附录ii 测试
附录iii 其他
索引
HeadFirstKotlin程序设计是2020年由机械工业出版社华章分社出版,作者[美] 道恩·格里菲斯。
得书感谢您对《HeadFirstKotlin程序设计》关注和支持,如本书内容有不良信息或侵权等情形的,请联系本网站。