归约和收集
一.归约
T reduce(T identity, BinaryOperator<T> accumulator);
作用:可以将流中的元素反复结合起来,得到新的值。返回T
- 第一个参数T identity,就是起始值
- 第二个参数BinaryOperator< T > accumulator,BinaryOperator继承自 BiFunction,是一个进行二元运算的函数。
例:
public void test1() {
List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9);
Integer sum = list.stream().reduce(0, (x,y) -> x+y);
System.out.println(sum);
}
output:
45
工作原理:先以0为初始值,0+1=1,1又作为初始值,1+2=3;3又作为初始值,3+3=6,依此类推,得到1到9的sum总和。
Optional< T > reduce(BinaryOperator<T> accumulator);
作用:可以将流中的元素反复结合起来,得到新的值。返回 Optional T
参数与第一种reduce的参数2相同
为什么要用Optional呢??Optional可以接收null,看下面的例子,emplyees的工资可以为空,但是上面的例子总和不可能为空。所以用Optional接收。
Optional<Double> op = emplyees.Stream()
.map(Employee::getSalary)
.reduce(Double::sum);
System.out.println(op.get());
Output:
45333
代码思路:
emplyees.Stream()
:先将emplyees数组变成流。.map(Employee::getSalary)
: 获取到emplyees中的所有人的薪水(提取)reduce(Double::sum);
:sum是Double中的一个静态方法,引用方法的形式代替lambda表达式。op.get()
:获取到op的值
map与reduce的连接通常叫做map-reduce模式,因Google用此来进行网络搜索而出名。