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

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

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

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

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

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

下面我们来看一些例子。

单参数方法

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

双参数方法

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

三参数方法

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

这里我们将在reduce()方法中传递三个参数identity、accumulator和combiner。标识值必须是组合器函数的标识。这种三参数方法用于并行处理。合并器只与并行流一起工作,否则就没有要合并的内容。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

更多例子

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

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

将列表和数组缩减求和

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. Weblogic是瓦特?和JVM是瓦特关系?
  2. centos添加开机启动项目
  3. Ubuntu安装VMware Tools的方法
  4. MD5算法步骤详解
  5. 如何显示Mac OS X上的隐藏文件和文件夹
  6. Android 进程和线程模型
  7. OFBIZ分享:利用Nginx +Memcached架设高性能的服务
  8. input type=&quot;hidden&quot; js获取不到值(document.getelementbyid OR $(#).val())
  9. windows环境VS2015编译TensorFlow C++程序完全攻略
  10. python基础教程002_列表与元组
  11. 如何像Python高手(Pythonista)一样编程
  12. ios开发中字符串的常用功能总结
  13. P2648 赚钱
  14. js基础学习笔记(一)
  15. powershell配置Gvim
  16. 关于:url、视图函数、模板3者之间参数传递的理解
  17. C++ 学习笔记 变量和基本类型(一)
  18. python opencv3 cornerHarris 角点检测
  19. IFrame实现的无刷新(仿ajax效果)...
  20. 2793 [Poi2012]Vouchers

热门文章

  1. Mysql - 如何存储 10位、13位的 unix 时间戳?
  2. 手把手教你基于Netty实现一个基础的RPC框架(通俗易懂)
  3. Salesforce Consumer Goods Cloud 浅谈篇三之 行动计划(Action Plan)相关配置
  4. 最大连续子数组和--dp
  5. [bzoj5417]你的名字
  6. 分布式事务(七)之Seata简介
  7. 一文带你吃透CLR垃圾回收机制
  8. idea创建 springboot工程(支持jsp)
  9. IPv4 寻址方式简介
  10. SpringBoot集成邮件发送