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 List<Integer> list = List.of(1, 2, 3);
输出结果: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