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
posted @ 2022-12-13 08:22  #庄生晓梦  阅读(3880)  评论(0编辑  收藏  举报