优势
- 天生支持面向对象
- 集成线程、锁
- 各种有用的库
- 运行于JVM上,一次编写随处运行
- 霸主地位
挑战
- 可能会被同样运行于JVM上的竞争对手取代,如Scala、Groovy
- 编程生态改变,大数据处理要求并行,Java8之前版本并不支持
- 能不能写出类SQL风格的程序
Java 8 实战 |
Java 8 In Action
基础知识
为什么关心Java 8
Java怎么还在变
Java在编程语言生态系统中的位置
流处理
流是一系列数据项,我们可以从输入流中一个个读取数据项并进行处理,将结果写入到输出流中。
cat file1 file2 | tr "[A-Z]" "[a-z]" | sort | tail -3
并行处理
Stream API 基础以上思想。
好处:
用行为参数化把代码传递给方法
把方法作为参数传递给另一个方法。
并行与共享的可变数据
不能访问共享的可变数据,必须能够同时对不同的输入安全地执行。
Java需要演变
远离常侧重改变现有值的经典面向对象思想;
向函数式编程领域转变。
在大面上考虑做什么被认为是头等大事,并和如何实现区分开来。
“使用Java 8,就是在保护你作为Java程序员的职业生涯”。
Java中的函数
方法和Lambda作为一等公民
传递代码:一个栗子
从传递方法到Lambda
流
默认方法
来自函数式编程的其他好思想
小结
通过行为参数化传递代码
应对不断变化的需求
初试牛刀:筛选绿苹果
再展身手:把颜色作为参数
第三次尝试:对你能想到的每个属性做筛选
行为参数化
对付啰嗦
匿名类
第五次尝试:使用匿名类
第六次尝试:使用Lambda表达式
第七次尝试:将List类型抽象化
真实的例子
用Comparator来排序
用Runnable执行代码块
GUI事件处理
小结
Lambda 表达式
Lambda管中窥豹
在哪里以及如何使用Lambda
函数式接口
函数描述符
把Lambda付诸实践:环绕执行模式
第1步:记得行为参数化
第2步:使用函数式接口来传递行为
第3步:执行一个行为
第4步:传递Lambda
使用函数式接口
Predicate
Consumer
Function
类型检查、类型推断以及限制
类型检查
同样的Lambda,不同的函数式接口
类型推断
使用局部变量
方法引用
Lambda和方法引用实战
复合Lambda表达式的有用方法
数学中的类似思想
小结
函数式数据处理
引入流
流是什么
流简介
流与集合
流操作
小结
使用流
筛选和切片
用谓词筛选
筛选各异的元素
截断流
跳过元素
映射
对流中每一个元素应用函数
流的扁平化
查找和匹配
检查谓词是否至少匹配一个元素
检查谓词是否匹配所有元素
查找元素
查找第一个元素
规约
元素求和
最大值和最小值
付诸实践
领域:交易员和交易
解答
数值流
原始类型流特化
数值范围
数值流应用:勾股数
构建流
由值创建流
由数组创建流
由文件创建流
由函数生成流:创建无限流
小结
用流收集数据
收集器简介
收集器用作高级归约
预定义收集器
归约和汇总
查找流中的最大值和最小值
汇总
连接字符串
广义的归约汇总
分组
多级分组
按子组收集数据
分区
分区的优势
将数字按质数和非质数分区
收集器接口
理解Collector接口声明的方法
全部融合到一起
开发自己的收集器以获得更好的性能
仅用质数做除数
比较收集器的性能
并行数据处理与性能
并行流
将顺序流转换为并行流
测量流性能
正确使用并行流
高效使用并行流
分支/合并框架
使用RecursiveTask
使用分支/合并框架的最佳做法
工作窃取
Spliterator
拆分过程
实现你自己的Spliterator
高效Java 8编程
重构、测试、调试
默认方法
用Option取代null
CompletableFuture: 组合式异步编程
新的日期和时间API
超越Java 8
函数式的思考
函数式编程的技巧
面向对象和函数式编程的混合:Java 8和Scala的比较
结论以及Java的未来