来源:[英]厄马(Raoul-Gabriel Urma)[意] 弗斯科(Mario Fusco)[英] 米克罗夫特(Alan Mycroft). Java 8实战 (图灵程序设计丛书) (Kindle 位置 1022-1028). 人民邮电出版社. Kindle 版本.
1.行为参数化:
将一个代码块作为另一个方法的参数(实现:匿名内部类)
GUI编程:执行一个操作来响应特定事件(类似与观察者模式)
- 行为参数化,就是一个方法 接受 多个不同的行为作为参数,并在内部使用它们, 完成 不同行为的能力。
- 行为参数化可让代码更好地适应不断变化的要求,减轻未来的工作量。
- 传递代码,就是将新行为作为参数传递给方法。但在Java 8之前这实现起来很啰嗦。为接口声明许多只用一次的实体类而造成的啰嗦代码,在Java
8之前可以用匿名类来减少。 - Java API包含很多可以用不同行为进行参数化的方法,包括排序、线程和GUI处理。
2.lamdba
语法:主体可以使用{}以实现多行,并支持增加返回值
lamdba表达式实际表示一个函数式接口【@FunctionalInterface】(只有一个抽象方法的接口)的匿名实现
jdk提供的函数式接口:3.4.1 Predicate 3.4.2 Consumer 3.4.3 Function
方法引用:对特定lambda的一种特定写法
示例:inventory.sort((Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight()));
等价于:inventory.sort(comparing(Apple::getWeight));
3.流:
经测试适用于流的场景:1.执行的内容需要耗时较长 2.遍历次数较大
否则效率并没有普通for循环或foreach的效率高
流可以使代码类似于使用sql一样,对集合进行筛选排序等。
List<String> lowCaloricDishesName = menu.stream()
.filter(d -> d.getCalories() < 400) ←─选出400卡路里以下的菜肴
.sorted(comparing(Dish::getCalories)) ←─按照卡路里排序
.map(Dish::getName) ←─提取菜肴的名称
.collect(toList()); ←─将所有名称保存在List中
//为了利用多核架构并行执行这段代码,你只需要把stream() 换成 parallelStream() :
List<String> lowCaloricDishesName = menu.parallelStream()
.filter(d -> d.getCalories() < 400)
.sorted(comparing(Dishes::getCalories))
.map(Dish::getName)
.collect(toList());
/**
并行流:menu.parallelStream()
串行:menu.stream()
**/
3.1流只能被遍历一次
3.2流的中间操作都是在最后一步(终端操作:返回不是流的操作)一次完成的,延时执行;以上为例,collect时候才会迭代并使用以上条件,这个collect即为终端操作
3.3map/flatMap
-
Streams API可以表达复杂的数据处理查询。常用的流操作总结在表5-1中。
-
你可以使用filter 、 distinct 、 skip 和 limit对流做筛选和切片。
-
你可以使用map 和 flatMap提取或转换流中的元素。
-
你可以使用findFirst 和 findAny方法查找流中的元素。
-
你可以用allMatch 、 noneMatch 和 anyMatch方法让流匹配给定的谓词。
-
这些方法都利用了短路:找到结果就立即停止计算;没有必要处理整个流。
-
你可以利用reduce方法将流中所有的元素迭代合并成一个结果,例如求和或查找最大元素。
-
filter 和 map等操作是无状态的,它们并不存储任何状态。reduce等操作要存储状态才能计算出一个值。sorted 和
distinct等操作也要存储状态,因为它们需要把流中的所有元素缓存起来才能返回一个新的流。这种操作称为有状态操作 。 -
流有三种基本的原始类型特化:IntStream 、 DoubleStream 和 LongStream。它们的操作也有相应的特化。
-
流不仅可以从集合创建,也可从值、数组、文件以及iterate 与 generate等特定方法创建。
-
无限流是没有固定大小的流。
-
collect是一个终端操作,它接受的参数是将流中元素累积到汇总结果的各种方式(称为收集器)。
-
预定义收集器包括将流元素归约和汇总到一个值,例如计算最小值、最大值或平均值。这些收集器总结在表6-1中。
-
预定义收集器可以用groupingBy对流中元素进行分组,或用partitioningBy进行分区。
-
收集器可以高效地复合起来,进行多级分组、分区和归约。
-
你可以实现Collector接口中定义的方法来开发你自己的收集器。
待补充。。。
4.并行流
5.Optional
6.CompletableFuture:组合式异步编程
7.新的日期和时间API
8.函数式编程
jdk1.7:
分支/合并框架:分支/合并框架的目的是以递归方式将可以并行的任务拆分成更小的任务,然后将每个子任务的结果合并起来生成整体结果。它是ExecutorService接口的一个实现,它把子任务分配给线程池(称为ForkJoinPool)中的工作线程。首先来看看如何定义任务和子任务。
jdk1.8:
- 注解的升级
2.类库的升级