在本页中,我们将提供 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

【Java 8】Stream通过reduce()方法合并流为一条数据示例的更多相关文章

  1. java 数据类型:集合接口Collection之 Stream 的reduce方法

    Stream 的reduce递归计算 import java.util.ArrayList; import java.util.Arrays; import java.util.List; impor ...

  2. Java 线程池 +生产者消费者+MySQL读取300 万条数据

    1.1需求 数据库300 万条用户数据 ,遍历获取所有用户, 各种组合关联, 获取到一个新的json ,存到redis 上. 1.2 难点 数据库比较多, 不可能单线程查询所有的数据到内存. 1.3解 ...

  3. java 21 - 13 IO流之 合并流

    SequenceInputStream :表示其他输入流的逻辑串联. 构造方法摘要 SequenceInputStream(Enumeration<? extends InputStream&g ...

  4. JAVA List根据字段排序以及取前几条数据

    1.经常会遇到对组装的list排序或提取list中前几条数据,例如: 根据时间排序: list.sort((o1, o2) -> o2.getCreateTime().compareTo(o1. ...

  5. Java中如何实现j并发更新数据库同一条数据

    分情况来说:普通单应用并发.多应用或多台服务器并发 情况一:普通单应用并发 使用关键字synchronized就可实现. 情况二:多应用或多台服务器并发 因多个应用之间并非同一个jvm(应用)内,因此 ...

  6. [五]java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用

    reduce-归约 看下词典翻译: 好的命名是自解释的 reduce的方法取得就是其中归纳的含义 java8 流相关的操作中,我们把它理解 "累加器",之所以加引号是因为他并不仅仅 ...

  7. Java 8 新特性-菜鸟教程 (5) -Java 8 Stream

    Java 8 Stream Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据. Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种 ...

  8. java.util.stream 库简介

    Java Stream简介 Java SE 8 中主要的新语言特性是拉姆达表达式.可以将拉姆达表达式想作一种匿名方法:像方法一样,拉姆达表达式具有带类型的参数.主体和返回类型.但真正的亮点不是拉姆达表 ...

  9. Java 8 Stream流编程学习

    本文是自己学习菜鸟教程中总结的笔记,用于快速找代码,完整的文档见菜鸟教程:Java 8 Stream Stream 使用一种类似用SQL语句从数据库查询数据的直观方式来提供一种对Java集合运算和表达 ...

随机推荐

  1. 事件消息生产消费中间件-OSS.DataFlow

    系统重构解耦的过程涉及不同领域服务分拆,或同一服务下实时响应部分和非响应部分分拆,分解后的各部分通过异步消息的流转传递,完成整体的业务逻辑,但是频繁的在业务层面直接调用不同消息队列的SDK,个人感觉不 ...

  2. Redis未授权总结

    以前的笔记 简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(so ...

  3. [第二章]c++学习笔记5(构造函数和析构函数调用时机)

    示例函数 注:输出并不一定从main函数开始,如全局对象的初始化在main函数前执行,如构造函数中存在输出,则从构造函数的输出开始 此处6被类型转换构造函数的存在转换为临时对象赋值,而在这个过程结束后 ...

  4. 性能优化 | Go Ballast 让内存控制更加丝滑

    关于 Go GC 优化的手段你知道的有哪些?比较常见的是通过调整 GC 的步调,以调整 GC 的触发频率. 设置 GOGC 设置 debug.SetGCPercent() 这两种方式的原理和效果都是一 ...

  5. Python使用cx_Oracle模块操作Oracle数据库--通过sql语句和存储操作

    https://www.jb51.net/article/125160.htm?utm_medium=referral  Python使用cx_Oracle调用Oracle存储过程的方法示例 http ...

  6. [loj3462]括号路径

    对于两条边$(x_{1},y,c)$和$(x_{2},y,c)$,不难发现$x_{1}$与$x_{2}$完全等价,因此可以合并 重复此过程,合并之后用启发式合并来合并边集(注意自环也可以参与合并,即$ ...

  7. [atARC083F]Collecting Balls

    考虑一个构造,对于坐标$(x,y)$,连一条$x$到$y$的边(注意:横坐标和纵坐标即使权值相同也是不同的点),之后每一个连通块独立,考虑一个连通块内部: 每一个点意味着一次删除操作,每一个边意味着一 ...

  8. [gym102770L]List of Products

    有一个很重要的性质:若$a\le b$且$c\le d$,则$ac\le bd$ 根据这一性质,就可以利用单调性$o(n)$求出小于$a_{x}\cdot b_{y}$的数的个数(先要对$a$和$b$ ...

  9. ICCV2021 | PnP-DETR:用Transformer进行高效的视觉分析

    ​  前言  DETR首创了使用transformer解决视觉任务的方法,它直接将图像特征图转化为目标检测结果.尽管很有效,但由于在某些区域(如背景)上进行冗余计算,输入完整的feature maps ...

  10. layui的入门使用

    1.如果使用单独的layui插件的话需要先引入jquery的插件,官方建议1.8+的版本. 2.引入后就能根据规则正常使用了.