stream中reduce的三种用法
stream中reduce的三种用法
概述
1. stream API中提供的reduce方法是经常被用到的,也是比较难理解的。它的作用主要是对流中的数据按照指定的计算方式计算出一个结果(缩减操作)。
2. reduce方法有三个override的方法,分别接受1个参数,2个参数,和3个参数,下面来依次介绍
一、2个参数
为了方便理解,我们先从2个参数的reduce方法开始介绍
方法定义为:T reduce(T identity, BinaryOperator<T> accumulator);
我们先看下这段代码:
1 // 初始化值 2 int sum = 0; 3 List list={1,2,3,4,5}; 4 for (n : list) { 5 // 指定计算方式 6 sum = (sum, n) -> sum + n; 7 8 } 9 return sum;
再来看下reduce两个参数的重载形式,与上面for循环的代码很相似,其内部的计算方式如下:
1 T result = identity 2 for(T element: this stream) 3 result = accumulator.apply(result,element) 4 5 return result;
可见,reduce的作用是把stream中的元素给组合起来,我们可以传入一个初始值,它会按照我们的计算方式依次拿流中的元素和初始化值进行计算,计算结果再和后面
的元素计算
举例:
1 public static void main(String[] args) { 2 3 /*Integer sum1 = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9).reduce(0, new BinaryOperator<Integer>() { 4 @Override 5 public Integer apply(Integer integer, Integer integer2) { 6 return integer + integer2; 7 } 8 });*/ 9 10 // lambda表达式 11 int sum1 = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9).reduce(0, (n1, n2) -> n1 + n2); 12 System.out.println("累加和为:" + sum1); //累加和为:45 13 }
二、1个参数
方法定义为:Optional<T> reduce(BinaryOperator<T> accumulator);
reduce一个参数的重载形式内部的计算方式如下:
1 boolean foundAny = false; 2 T result = null; 3 for(T element : this stream){ 4 if(!foundAny){ 5 foundAny = true; 6 result = element; 7 } 8 else 9 result= accumulator.apply(result,element); 10 } 11 12 return foundAny?Optional.of(result):Optional.empty();
我们留意到这里返回值类型为Optional,这是因为Stream的元素有可能是0个,这样就没法调用reduce()的聚合函数了,因此返回Optional对象,需要进一步判断结果是否存在。