1.语言的演变
1.1.C和C++仍然是构建操作系统和各种嵌入式系统的流行工具
1.2.Java和C#等安全型语言在诸多运行资源不太紧张的应用中已经取代了C和C++
1.3.Java可能会被同样运行在JVM上的竞争对手语言(如Scala或Groovy)取代
1.4.Ada、Algol、COBOL、Pascal、Delphi、SNOBOL没落
1.4.1.COBOL一度是最重要的商用语言之一
2.Java的演进路径
2.1.Java 8于2014年3月
2.1.1.比Java历史上任何一次改变都深远
2.1.2.长支持(LTS)
2.2.Java 9于2017年9月
2.2.1.效率提升方面的重要改进
2.2.2.反应式编程支持
2.2.2.1.RxJava
2.2.2.2.Akka
2.2.2.3.构建高并发系统的标准方式
2.3.Java 10于2018年3月
2.3.1.对类型推断做了微调
2.4.Java 11于2018年9月
2.4.1.异步HTTP客户端库
2.4.2.长支持(LTS)
2.5.12 2019 年 3 月
2.6.13 2019 年 9 月
2.6.1.switch优化更新;文本块升级;增加ZGC以将未使用的堆内存返回给操作系统
2.7.14 2020 年 3 月
2.7.1.instanceof模式匹配;提出Records类;空指针异常的地方变得更具体;移除CMS垃圾收集器
2.8.15 2020 年 9 月
2.8.1.密封类;隐藏类;ZGC 成为正式的垃圾收集器
2.9.16 2021 年 3 月
2.9.1.内存管理提升;新的打包工具;UNIX-Domain Socket channels;Value-based Classes的警告;提供了 C++ 14语言特性
2.10.17 2021 年 9 月
2.10.1.恢复始终严格的浮点语义;增强型伪随机数发生器;弃用即将删除的Applet API
2.10.2.长支持(LTS)
2.11.18 2022 年 3 月
2.11.1.指定 UTF-8 作为标准 Java API 的默认字符集;引入一个简单的 Web 服务器;支持在 Java API 文档中加入代码片段
2.12.19 2022 年 9 月
2.12.1.结构化并发
2.12.2.Record模式
2.12.3.外部函数和内存 API
2.12.4.虚拟线程
2.12.5.switch 表达式和语句的模式匹配
2.13.从Java的演进路径来看,它一直致力于让并发编程更容易、出错更少
3.Java8解决了两个迫切需求
3.1.编写更简洁的代码
3.1.1.Stream API
3.1.1.1.由Stream库来选择底层最佳执行机制
3.1.1.2.避免用synchronized编写代码
3.1.2.向方法传递代码的技巧
3.1.3.接口的默认方法
3.2.更方便地利用处理器的多核
4.流处理
4.1.流是一系列数据项,一次只生成一项
4.2.程序可以从输入流中一个一个读取数据项,然后以同样的方式将数据项写入输出流
5.函数式编程范式的基石
5.1.没有共享的可变数据
5.1.1.一个方法可以通过它将参数值转换为结果的方式来完整描述
5.1.2.就像一个数学函数,没有可见的副作用
5.1.3.所写的代码不能访问共享的可变数据来完成它的工作
5.1.4.“纯函数”“无副作用函数”或“无状态函数”
5.2.将方法和函数(即代码)传递给其他方法的能力
5.2.1.用行为参数化把代码传递给方法
6.命令式编程范式
6.1.写的程序则是一系列改变状态的指令
7.默认方法
7.1.默认方法只是推进程序演进的一种技术,并不会直接帮助你实现某个特性
7.2.接口可以包含实现类没有提供实现的方法签名了
7.3.给接口设计者提供了一种扩充接口的方式,而不会破坏现有的代码
7.4.使用default关键字来表示
8.方法和Lambda作为一等值
8.1.方法引用
8.2.Lambda
8.2.1.匿名函数
8.2.2.长度多于几行的话,还是应该用方法引用来指向一个有描述性名称的方法,而不是使用匿名的Lambda
8.3.以代码的清晰度为准绳
9.谓词(predicate)
9.1.在数学上常常用来代表类似于函数的东西,它接受一个参数值,并返回true或false
9.2.Function‹T,Boolean›
9.3.Predicate‹T›
9.3.1.更标准的方式
9.3.2.效率更高
9.3.3.避免了把boolean封装在Boolean里面
10.外部迭代
10.1.for-each循环一个个地迭代元素
10.2.
11.内部迭代
11.1.数据处理完全是在库内部进行的
11.2.
12.Optional‹T›类
12.1.通过显式使用更多的描述性数据类型来避免null
12.2.如果能一致地使用它,就能帮助避免出现Null-PointerException
12.3.一个容器对象,它既可以包含值,也可以不包含值
12.4.通过类型系统,允许表明一个变量可能缺失值
13.(结构化的)模式匹配
13.1.使用模式匹配比if-then-else更简明
13.1.1.编译器能够检测常见的错误
13.2.采用多态和方法重写替代if-then-else来处理这种类型的数据
14.演变
14.1.使用for-each循环,而不用暴露Iterator里面的模板写法
14.2.经典面向对象思想,而向函数式编程领域转变
14.2.1.Collection主要是为了存储和访问数据,Stream则主要用于描述对数据的计算
14.3.Java 9提供了模块系统
14.3.1.模块对简单的类JAR组件进行了增强,使其具备了结构,既能作为用户文档,也能由机器进行检查
14.4.菱形继承问题