Java8 Stream reduce的三个参数方法的用法

目录

reduce()简介

reduce三个override方法

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)

本文要讲的是第三个方法,其中的参数列表为:

  1. 第一个参数:返回实例u,传递你要返回的U类型对象的初始化实例u
  2.  第二个参数:累加器accumulator,声明你在u上累加你的数据来源t的逻辑,例如(u,t)->u.sum(t),此时lambda表达式的行参列表是返回实例u和遍历的集合元素t,函数体是在u上累加t
  3.  第三个参数:参数组合器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)]

参考文章icon-default.png?t=M85Bhttps://www.cnblogs.com/MrYuChen-Blog/p/14061320.html

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值