描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787111650409
《Kotlin编程之美》以函数式编程的方式,教给读者编写更安全、易于理解的、易于维护的、更具可扩展性程序的方法和技巧。书中每个
小知识点跟随实战练习,讲解透彻,且免费提供所有源码。
作为Java开发人员,维护糟糕的遗留代码、解释晦涩的注释、反复编写相同的样板文件可能会让编程失去乐趣。《Kotlin编程之美》讲述用Kotlin编写易于理解、易于维护、安全的程序的方法和技巧。在本书中,经验丰富的工程师皮埃尔-伊夫斯?索蒙特将以全新的、以函数式编程的视角来处理常见的编程挑战,并用示例深入讲解如何正确处理错误和数据、如何管理状态以及如何利用惰性。
《Kotlin编程之美》的内容包括编程功能、处理可选数据、安全处理错误和异常以及处理和共享状态突变等。《Kotlin编程之美》的读者对象为中级Java或Kotlin开发人员、高等院校计算机相关专业学生以及对安全编程感兴趣的工程技术人员等。
目 录
封 面
译者序
致 谢
前 言
关于本书
关于读者
关于封面插图
第1章 让程序更安全
1.1 编程陷阱
1.1.1 安全的处理作用
1.1.2 用引用透明性使程序更安全
1.2 安全编程的好处
1.2.1 使用替换模型对程序进行推理
1.2.2 应用安全原则的简单示例
1.2.3 将抽象推向极限
1.3 本章小结
第2章 Kotlin中的函数式编程:概述
2.1 Kotlin中的字段和变量
2.1.1 省略类型以简化
2.1.2 使用可变字段
2.1.3 理解延迟初始化
2.2 Kotlin中的类和接口
2.2.1 使代码更加简洁
2.2.2 实现接口或扩展类
2.2.3 实例化一个类
2.2.4 重载属性构造函数
2.2.5 创建equals和hashCode方法
2.2.6 解构数据对象
2.2.7 在Kotlin中实现静态成员
2.2.8 使用单例模式
2.2.9 防止工具类实例化
2.3 Kotlin没有原语
2.4 Kotlin的两种集合类型
2.5 Kotlin的包
2.6 Kotlin的可见性
2.7 Kotlin中的函数
2.7.1 函数声明
2.7.2 使用局部函数
2.7.3 覆盖函数
2.7.4 使用扩展函数
2.7.5 使用lamdba表达式
2.8 Kotlin中的null
2.8.1 处理可空类型
2.8.2 Elvis和默认值
2.9 程序流程和控制结构
2.9.1 使用条件选择器
2.9.2 使用多条件选择器
2.9.3 使用循环
2.10 Kotlin的未检查异常
2.11 自动关闭资源
2.12 Kotlin的智能转换
2.13 相等性VS一致性
2.14 字符串插值
2.15 多行字符串
2.16 型变:参数化类型和子类型
2.16.1 为什么型变是一个潜在的问题
2.16.2 何时使用协变以及何时使用逆变
2.16.3 声明端型变与使用端型变
2.17 本章小结
第3章 用函数编程
3.1 函数是什么?
3.1.1 理解两个函数集之间的关系
3.1.2 Kotlin中反函数概述
3.1.3 处理偏函数
3.1.4 理解函数复合
3.1.5 使用多参数函数
3.1.6 柯里化函数
3.1.7 使用偏应用函数
3.1.8 没有作用的函数
3.2 Kotlin中的函数
3.2.1 将函数理解为数据
3.2.2 将数据理解为函数
3.2.3 使用对象构造函数作为函数
3.2.4 使用Kotlin的fun函数
3.2.5 使用对象表示法和函数表示法
3.2.6 使用值函数
3.2.7 使用函数引用
3.2.8 复合函数
3.2.9 重用函数
3.3 高级函数特征
3.3.1 多参数函数如何?
3.3.2 应用柯里化函数
3.3.3 实现高阶函数
3.3.4 创建多态高阶函数
3.3.5 使用匿名函数
3.3.6 定义局部函数
3.3.7 实现闭包
3.3.8 应用偏函数和自动柯里化
3.3.9 切换偏应用函数的参数
3.3.10 声明单位函数
3.3.11 使用正确的类型
3.4 本章小结
第4章 递归、尾递归和记忆化
4.1 共递归与递归
4.1.1 实现共递归
4.1.2 实现递归
4.1.3 区分递归函数和共递归函数
4.1.4 选择递归或尾递归
4.2 尾调用消除
4.2.1 使用尾调用消除
4.2.2 从循环切换到共递归
4.2.3 使用递归值函数
4.3 递归函数和列表
4.3.1 使用双递归函数
4.3.2 对列表抽象递归
4.3.3 反转列表
4.3.4 构建共递归列表
4.3.5 严格的后果
4.4 记忆化
4.4.1 在基于循环的编程中使用记忆化
4.4.2 在递归函数中使用记忆化
4.4.3 使用隐式记忆化
4.4.4 使用自动记忆化
4.4.5 实现多参数函数的记忆化
4.5 记忆函数纯吗?
4.6 本章小结
第5章 用列表处理数据
5.1 如何对数据集合进行分类
5.2 不同类型的列表
5.3 相对期望列表性能
5.3.1 用时间来交换内存空间和复杂性
5.3.2 避免就地突变
5.4 KOTLIN有哪些可用列表?
5.4.1 使用持久数据结构
5.4.2 实现不可变的、持久的单链表
5.5 列表操作中的数据共享
5.6 更多列表操作
5.6.1 标注的益处
5.6.2 连接列表
5.6.3 从列表末尾删除
5.6.4 使用递归对具有高阶函数(HOFs)的列表进行折叠
5.6.5 使用型变
5.6.6 创建foldRight的一个栈安全递归版本
5.6.7 映射和过滤列表
5.7 本章小结
第6章 处理可选数据
6.1 空指针问题
6.2 Kotlin如何处理空引用
6.3 空引用的替代方法
6.4 使用OPTION类型
6.4.1 从一个Option中获取值
6.4.2 将函数应用于可选值
6.4.3 处理Option组合
6.4.4 Option用例
6.4.5 其他组合选项的方法
6.4.6 用Option组合List
6.4.7 何时使用Option
6.5 本章小结
第7章 处理错误和异常
7.1 数据缺失的问题
7.2 Either类型
7.3 Result类型
7.4 Result模式
7.5 高级Result处理
7.6 映射Failture
7.7 添加工厂函数
7.8 应用作用
7.9 高级结果组合
7.10 本章小结
第8章 高级列表处理
8.1 长度问题
8.2 性能问题
8.3 记忆化的好处
8.3.1 处理记忆化的缺点
8.3.2 评估性能改进
8.4 List和Result组成
8.4.1 处理List返回Result
8.4.2 从List转换为Result
8.5 常见列表抽象
8.5.1 压缩和解压缩列表
8.5.2 通过索引访问元素
8.5.3 列表分裂
8.5.4 搜索子列表
8.5.5 处理列表的其它函数
8.6 列表的自动并行处理
8.6.1 并不是所有的计算都可以并行化
8.6.2 将列表分解为子列表
8.6.3 并行处理子列表
8.7 本章小结
第9章 与惰性配合
9.1 严格VS惰性
9.2 Kotlin和严格
9.3 Kotlin和惰性
9.4 懒惰的实现
9.4.1 组合惰性值
9.4.2 提升函数
9.4.3 映射和flatMapping惰性
9.4.4 用列表组成惰性
9.4.5 处理异
虽然Kotlin诞生于2011年,但它已经是Java生态系统中最新的语言之一了。在那之后,Kotlin发布了一个运行在JavaScript虚拟机上的版本和一个编译为原生代码的版本。尽管这些版本之间有很大差异(因为Java版本依赖于Java标准库,而Java标准库在其他两个版本中不可用),但这也使得Kotlin成为了一种比Java更通用的语言。JetBrains作为Kotlin的创建者正在努力使每个版本都达到相同的水平,但是这需要时间。
到目前为止,JVM(Java虚拟机)版本是使用最多的版本,尤其是当谷歌决定采用Kotlin作为开发Android应用程序的官方语言时,这一版本得到了极大提升。被谷歌采用的一个主要原因是,Android中可用的Java版本是Java6,而Kotlin提供了Java11绝大部分的特性,甚至更多。Gradle也采用Kotlin作为构建脚本的官方语言来替代Groovy,Groovy同样允许使用Kotlin所构建的内容。
Kotlin主要针对Java程序员。也许将来有一天,程序员会把Kotlin作为主要语言来学习。但是现在,大多数程序员只会从Java过渡到Kotlin。
编程语言的独特之处主要取决于其某些特定的基本概念,Java在创建时考虑了几个强大的概念。Java应该在任何支持JVM的环境中运行,其承诺“一次编写,到处运行”。尽管有些人可能持相反意见,但这一承诺已经实现。Kotlin是一种可以在几乎所有的地方运行Java程序,还可以运行用其他语言编写并为JVM编译的程序语言。
Java的另一个承诺是任何演变都不会破坏现有代码。虽然有例外,但大多数情况下是这样的。这不一定是个好事,它会导致其他语言中的众多改进无法被引入Java,因为这些改进会破坏其兼容性。任何使用先前Java版本编译的程序都必须能够在新版本中运行,而不需要重新编译。这个承诺是否有用,使用者观点各异,但结果是,向后兼容性一直与Java的发展背道而驰。
Java还应该通过使用检查异常使程序更安全,从而迫使程序员考虑这些异常。对于很多程序员而言,这已经被证实为一种负担,会导致检查异常被不断地包装成未检查异常。
虽然Java是面向对象的编程语言,但是对于数字运算,它应该和大多数编程语言一样快。语言设计者决定,除了表示数字和布尔值的对象外,在拥有相应的非对象基本类型时,Java也可以更快地计算。这会导致不能(现在仍然不能)将基本类型放入诸如list、set或者map等集合中。此外,当添加流时,设计者决定创建特定的基本类型版本——但不是所有基本类型,只是那些常用的类型。如果正在使用一些不支持的基本类型,则无法创建。
函数也是如此。Java 8中添加了泛型函数,但是它们只允许操作对象,而不允许操作基本类型。因此,专门设计了一些特定的函数来处理整数、长整数、双精度数和布尔数(不幸的是,不是所有的基本类型都有,比如,没有针对byte、short和float等基本类型的函数)。更糟糕的是,需要额外的函数将一个基本类型转换为另一个基本类型,或者将基本类型转换为对象后再转换回来。
Java是20多年前设计的,从那时起发生了很多变化,但是大部分变化都无法引入到Java中。因为这些变化会破坏其兼容性,或者它们的引入需要以牺牲可用性为代价来保持兼容性。
许多新的编程语言,如Groovy、Scala和Clojure等,自发布以来都已经解决了这些限制。这些编程语言在一定程度上与Java兼容,这意味着可以在基于这些语言的项目中使用现有的Java库,而Java程序员也可以使用基于这些语言开发的库。
Kotlin不一样,它与Java深度集成,甚至可以在同一个项目中混合使用Kotlin和Java源代码。与其他JVM语言不同,Kotlin看起来并不像是另外一种语言(尽管有些许差异)。相反,它看起来更像是Java,甚至有人说Kotlin才是Java应有的样子,这意味着Kotlin解决了Java语言的大部分问题(但Kotlin还未解决JVM的局限性)。
更重要的是,Kotlin的设计对许多函数式编程的技术更加友好。Kotlin有可变引用和不可变引用,然而它更侧重于不可变引用。为了平稳过渡,Kotlin支持传统的控制结构,但是它采用了大量的函数抽象来避免控制结构。
使用Kotlin的另一个好处是减少了对样板代码的需求,并使其最小化。可以使用Kotlin在一行代码中创建具有可选属性的类(加上equals、hashCode、toString和copy等函数),而用Java编写的相同的类大约需要30行(包括getter、setter和重载构造函数等)。
虽然出现了旨在克服Java在JVM环境限制的其他编程语言,但是Kotlin不一样,它在项目源代码级别与Java程序集成。在同一个项目中,可以用一个构建链来混合Java和Kotlin的源文件。这将改变游戏规则,尤其对团队编程而言,在Java环境中使用Kotlin并不比使用任何第三方库更麻烦。这也使得从Java到一种新编程语言的转换尽可能平稳,从而能够编写以下特性的程序。
■更安全。
■易于编写、测试和维护。
■更具可扩展性。
预计很多读者是Java程序员,正在寻找解决日常问题的新方案。如果是这样的话,读者可能会问为什么要使用Kotlin?难道Java生态系统中还没有其他语言可以轻松地实现安全编程技术吗?
当然有,其中最著名的就是Scala。这是一个很好的Java替代品,但是Kotlin有更强
评论
还没有评论。