【Java 8 新特性】Java 8 Stream通过reduce()方法合并流为一条数据示例_猫巳的博客-CSDN博客

文章目录

在本页中,我们将提供 Java 8 Stream reduce()示例。

Stream reduce()对流的元素执行缩减。它使用恒等式和累加器函数进行归约。

在并行处理中,我们可以将合并器函数作为附加参数传递给该方法。

Stream reduce()可用于获取存储在集合中的数字的总和。

Stream reduce()还可以用给定的分隔符连接存储在集合中的字符串数据。

Stream reduce()方法可以根据需要执行更多的还原任务

下面我们来看一些例子。

1.Stream.reduce()做累加操作

Stream.reduce()默认使用BinaryOperator作为累加器(Accumulator)。如果是数字,则起始值为0。如果是字符串,则起始值将为空字符串。

reduce(BinaryOperator accumulator)

方法将返回Optional实例。找到例子。

ReduceDemo1.java

package com.concretepage;
import java.util.Arrays;
public class ReduceDemo1 {
    public static void main(String[] args) {
          int[] array = {23,43,56,97,32};
          Arrays.stream(array).reduce((x,y) -> x+y).ifPresent(s -> System.out.println(s));
          Arrays.stream(array).reduce(Integer::sum).ifPresent(s -> System.out.println(s));
          Arrays.stream(array).reduce(StatisticsUtility::addIntData).ifPresent(s -> System.out.println(s));
    }
}  

StatisticsUtility.java

package com.concretepage;
public class StatisticsUtility {
    public static int addIntData(int num1, int num2) {
        return num1 + num2;
    }
} 

输出

251
251
251 

2.Stream.reduce()带初始值的累加操作

这里我们将使用一个恒等式和累加器。我们将传递标识作为起始值。

reduce(T identity, BinaryOperator<T> accumulator)

来看一组示例

ReduceDemo2.java

package com.concretepage;
import java.util.Arrays;
public class ReduceDemo2 {
    public static void main(String[] args) {
          int[] array = {23,43,56,97,32};
          //Set start value. Result will be start value + sum of array. 
          int startValue = 100;
          int sum = Arrays.stream(array).reduce(startValue, (x,y) -> x+y);
          System.out.println(sum);
          sum = Arrays.stream(array).reduce(startValue, Integer::sum);
          System.out.println(sum);
          sum = Arrays.stream(array).reduce(startValue, StatisticsUtility::addIntData);
          System.out.println(sum);
    }
}  

输出

351
351
351 

3.Stream.reduce()与标识(Identity),累加器(Accumulator), 组合器(Combiner)使用

这里我们将在reduce()方法中传递三个参数identityaccumulatorcombiner。标识值必须是组合器函数的标识。这种三参数方法用于并行处理。合并器只与并行流一起工作,否则就没有要合并的内容。Accumulator先处理后,Combiner再执行。

reduce(U identity, BiFunction<U,? super T,U> accumulator, BinaryOperator<U> combiner)

ReduceDemo3.java

package com.concretepage;
import java.util.Arrays;
import java.util.List;
public class ReduceDemo3 {
    public static void main(String[] args) {
      List<Integer> list2 = Arrays.asList(5, 6, 7);
      int res = list2.parallelStream().reduce(1, (s1, s2) -> s1 * s2, (p, q) -> p * q);
      System.out.println(res);
    }
} 

输出

210 

4.将列表和数组缩减为字符串

ReduceToString.java

package com.concretepage;
import java.util.Arrays;
import java.util.List;
public class ReduceToString {
    public static void main(String[] args) {
        //Reduce Array to String.
        String[] array = {"Mohan", "Sohan", "Mahesh"};
        Arrays.stream(array).reduce((x, y) -> x +"," + y)
               .ifPresent(s -> System.out.println("Array to String: "+ s));
        //Reduce List to String.
        List<String> list = Arrays.asList("Mohan", "Sohan", "Mahesh");
        list.stream().reduce((x, y) -> x +"," + y)
                   .ifPresent(s -> System.out.println("List to String: "+ s));
    }
} 

输出

Array to String: Mohan,Sohan,Mahesh
List to String: Mohan,Sohan,Mahesh 

5.将列表和数组缩减求和

ReduceToSum.java

package com.concretepage;
import java.util.Arrays;
import java.util.List;
public class ReduceToSum {
    public static void main(String[] args) {
        //Reduce Array to sum.
        int[] array = {30, 10, 20, 40};
        int sum = Arrays.stream(array).reduce(0, (x, y) -> x + y);
        System.out.println("Sum of Array: "+ sum);
        //Reduce List to sum.
        List<Integer> list = Arrays.asList(30, 10, 20, 40);
        sum = list.stream().reduce(0, (x, y) -> x + y);
        System.out.println("Sum of List: "+ sum);
    }
} 

输出

Sum of Array: 100
Sum of List: 100 

参考文献

【1】Java 8 Stream reduce() Example


原网址: 访问
创建于: 2021-10-27 09:47:24
目录: default
标签: 无

请先后发表评论
  • 最新评论
  • 总共0条评论