Java8看书笔记
Stream
Stream.of("d2", "a2", "b1", "b3", "c")
.filter(s -> {
System.out.println("filter: " + s);
return true;
});
不会打印任何东西,因为filter是衔接操作,延迟性,只会在终止操作调用时被执行。
Stream.of("d2", "a2", "b1", "b3", "c")
.filter(s -> {
System.out.println("filter: " + s);
return true;
})
.forEach(s -> System.out.println("forEach: " + s));
原始方法会在数据流的所有元素 衔接【中间】操作:
- filter:过滤 - sorted:不会改变原来集合中的元素排序 - map:把流对象中的每一个对象对应到另外一个对象上
中止操作 - foreach:遍历所有的对象 - match:用来判断某一种规则是否与流对象相互匹配 - count:返回当前对象的个数 - reduce:通过某方法,对元素进行削减操作
函数式接口
lambda表达式匹配Java的类型系统:每个lambda都能通过一个特定的接口,与一个给定的类型进行匹配。一个所谓的函数式接口必须要有且仅有必须要与抽象方法的声明相匹配。
Lambda的范围
能访问局部对应的外部区域的局部final变量,以及成员变量和静态变量
Predicates
布尔类型的函数
Functions
Function接口接收一个参数,并返回单一的结果,默认方法可以将多个函数串在一起
Suppliers
产生一个给定类型的结果,没有输入参数
Consumers
在一个输入参数上进行的操作
Optionals
防止NPE,简单的值容器
数据流怎么工作
- 衔接操作有延迟性,在终止操作时调用时被执行
Stream.of("d2", "a2", "b1", "b3", "c")
.filter(s -> {
System.out.println("filter: " + s);
return true;
})
.forEach(s -> System.out.println("forEach: " + s));
// 输出结果
filter: d2
forEach: d2
filter: a2
forEach: a2
filter: b1
forEach: b1
filter: b3
forEach: b3
filter: c
forEach: c
原始方法在数据流的所有元素上,一个接一个地水平执行所有操作,但是每个元素在调用链上垂直移动。
sorted操作时水平移动,言而总之,总而言之,就是要把filter写在前面。
collect
有用的终止操作,将流中的元素存放在不同类型的结果中,collect接受收集器(collector),由4个操作组成: - supplier - accumlator - combiner - finisher
Java8实现了多种内置收集器,在Collectors中.Collectors.toMap(); .collect(Collectors.toList());
构建自己的特殊收集器
使用Collector.of(),需要传递一个收集器的四个组成部分:供应器,累加器,组合器和终止器
Collector<Person, StringJoiner, String> personNameColector =
Collect.of(
() -> new StringJoiner(" | "), // suppiler
(j, p) -> j.add(p.name.toUpperCase()), // accumulator
(j1,j2) -> j1.merge.(j2), // combiner
StringJoiner::toString); // finisher
// 使用方法
String names = persons.stream.collect(personNameColector)
flatMap
map:将一个流中的对象转成另一种类型,只能映射成一个其他的对象
flatMap的作用:将流中的每个元素,转换成其他对象的流,可以转换成多个或者零个其他对象
optional:返回一个Optional或其他类型的对象,所以它可以用于避免null检查