目录
reduce(U identity, BiFunction accumulator, BinaryOperator combiner),>
在学习Stream的reduce过程中,对于reduce的第三个方法第一时间有点看不太懂,便记录一下学习过程吧。
reduce()简介
根据指定的计算模型将Stream中的值计算得到一个最终结果:reduce可以实现从Stream中生成一个值,其生成的值不是随意的,而是根据指定的计算模型。
reduce三个override方法
Optional reduce(BinaryOperator accumulator);
T reduce(T identity, BinaryOperator<T> accumulator);
<U> U reduce(U identity, BiFunction<U, ? super T, U> accumulator,
BinaryOperator<U> combiner);
reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner)
本文要讲的是第三个方法,其中的参数列表为:
- 第一个参数:返回实例u,传递你要返回的U类型对象的初始化实例u
- 第二个参数:累加器accumulator,声明你在u上累加你的数据来源t的逻辑,例如(u,t)->u.sum(t),此时lambda表达式的行参列表是返回实例u和遍历的集合元素t,函数体是在u上累加t
- 第三个参数:参数组合器combiner,接受lambda表达式。在串行流(stream)中,第三个参数combiner不会起作用。 在并行流(parallelStream)中,流被fork join出多个线程进行执行,此时每个线程的执行流程就跟第二个方法reduce(identity, accumulator)一样,而第三个参数combiner函数,则是将每个线程的执行结果当成一个新的流,然后使用第一个方法reduce(accumulator)流程进行规约。(这里看不太明白的,待会下面会有例子可以助于理解)
这一大段的文字,我们转换成伪代码看看:
容器x = list.stream().reduce(最终返回的容器x, (容器x, 元素y) -> {
容器x与元素y之间的逻辑操作;
return 容器x;
}, (x, y) -> {
并行的时候才会执行;
x和y是每个线程的返回的容器x;
这里进行各个容器的累计操作;
return x;
});
到了这里,想必你已经对reduce的第三个方法有初步认识了,接下来我们通过例子操作看看。
@Data
public class Employee{
private String name;
private String programingLanguage;
private Double salary;
private Integer age;
}
@Test
public void reduceTest() {
List<Employee> list= new ArrayList<Employee>() {
{
add(new Employee("Free", "male", 5000, 18));
add(new Employee("Tamsen", "female", 8371, 55));
add(new Employee("Hadley", "male", 7322, 25));
add(new Employee("Truman", "female", 15020, 15));
add(new Employee("Matilda", "male", 5272, 25));
add(new Employee("Pansy ", "female", 9057, 87));
add(new Employee("Keene", "male", 8120, 99));
add(new Employee("Jayden", "female", 8500, 25));
add(new Employee("Homer", "male", 6000, 14));
add(new Employee("Ridley", "female", 5426, 20));
}
};
ArrayList<Employee> newList = list.stream().reduce(new ArrayList<Employee>()
, (elist, employee) -> {
if (employee.getSalary() > 6000) {
elist.add(employee);
}
System.out.println("BiFunction: elist size = " + elist.size());
return elist;
}, (elist1, elist2) -> {
elist1.addAll(elist2);
System.out.println("BinaryOperator: elist1 size = " + elist1.size());
return elist1;
});
}
代码执行的结果为:
BiFunction: elist size = 0
BiFunction: elist size = 1
BiFunction: elist size = 2
BiFunction: elist size = 3
BiFunction: elist size = 3
BiFunction: elist size = 4
BiFunction: elist size = 5
BiFunction: elist size = 6
BiFunction: elist size = 6
BiFunction: elist size = 6[Employee(name=Tamsen, gender=female, salary=8371, age=55), Employee(name=Hadley, gender=male, salary=7322, age=25), Employee(name=Truman, gender=female, salary=15020, age=15), Employee(name=Pansy , gender=female, salary=9057, age=87), Employee(name=Keene, gender=male, salary=8120, age=99), Employee(name=Jayden, gender=female, salary=8500, age=25)]