stream中reduce的三种用法

欢乐豆123 / 2023-05-05 / 原文

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对象,需要进一步判断结果是否存在。