JAVA8 lambda之reduce三种用法
reduce操作可以根据指定的计算模型,实现从Stream中生成一个指定类型的值。
一,用法1
未定义初始值,从而第一次执行的时候第一个参数m的值是Stream的第一个元素,第二个参数n是Stream的第二个元素。
final List<Integer> list = List.of(1, 2, 3); final int sum = list.stream().reduce((m, n) -> { System.out.println("m:" + m); System.out.println("n:" + n); return m + n; }).get();
m:1
n:2
m:3
n:3
sum:6
二,用法2
定义了初始值,从而第一次执行的时候第一个a参数的值是初始值4,第二个参数b是Stream的第一个元素,方法的返回结果和初始值类型必须一致。
final List<Integer> list = List.of(1, 2, 3);
final int sum1 = list.stream().reduce(4, (a, b) -> {
System.out.println("a:" + a);
System.out.println("b:" + b);
return a + b;
});
a:4
b:1
a:5
b:2
a:7
b:3
sum1:10
三,用法3:
第一个参数类型是实际返回实例的数据类型,可以返回任意类型的数据。
第二个参数累加器,声明累加你的数据来源t的逻辑。
第三个参数函数用来组合两个值,而这两个值必须与第二个函数参数相兼容,也就是说它们所得的结果是一样的,他主要是用来处理并发操作,如何处理数据的重复性,应多做考虑,否则会出现重复数据。
使用条件:
第一点:identity
的初期值值对于合并运算combiner来说必须是一个恒等式,也就是说对于任意的u= combiner(identity,u)
第二点:combiner 必须和accumulator要兼容,对于任意的u 和 t,

<U> U reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner);
例子1:
第三个参数x,y没有起作用,因为不是并发【parallelStream】
final int sum2 = list.stream().reduce(4, (a, b) -> {
System.out.println("a:" + a);
System.out.println("b:" + b);
return a + b;
}, (x, y) -> {
System.out.println("x:" + x);
System.out.println("y:" + y);
return x + y;
});
a:4
b:1
a:5
b:2
a:7
b:3
sum2:10
例子2:
错误用法,初期值对第三个参数的方法产生了影响。
final List<Integer> list = List.of(1, 2, 3);
final int sum2 = list.parallelStream().reduce(4, (a, b) -> {
System.out.println("a:" + a);
System.out.println("b:" + b);
return a + b;
}, (x, y) -> {
System.out.println("x:" + x);
System.out.println("y:" + y);
return x + y;
});
a:4
b:2
a:4
b:3
a:4
b:1
x:6
y:7
x:5
y:13
sum2:18
例子3:
可以算正确用法
final List<Integer> list = List.of(1, 2, 3);
final List sum3 = list.parallelStream().reduce(new ArrayList(), (a, b) -> {
System.out.println("a:" + a);
System.out.println("b:" + b);
a.add(b);
return a;
}, (final List<Integer> x, final List<Integer> y) -> {
System.out.println("x:" + x);
System.out.println("y:" + y);
return x;
});
a:[]
b:2
a:[]
b:3
a:[2]
b:1
x:[2, 3]
y:[2, 3, 1]
x:[2, 3, 1]
y:[2, 3, 1]
sum3:[2, 3, 1]
参考:
https://www.bbsmax.com/A/QV5ZnP725y/
https://blog.csdn.net/zhang89xiao/article/details/77164866
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)