【Java 8】Stream通过reduce()方法合并流为一条数据示例
在本页中,我们将提供 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()方法合并流为一条数据示例的更多相关文章
- java 数据类型:集合接口Collection之 Stream 的reduce方法
Stream 的reduce递归计算 import java.util.ArrayList; import java.util.Arrays; import java.util.List; impor ...
- Java 线程池 +生产者消费者+MySQL读取300 万条数据
1.1需求 数据库300 万条用户数据 ,遍历获取所有用户, 各种组合关联, 获取到一个新的json ,存到redis 上. 1.2 难点 数据库比较多, 不可能单线程查询所有的数据到内存. 1.3解 ...
- java 21 - 13 IO流之 合并流
SequenceInputStream :表示其他输入流的逻辑串联. 构造方法摘要 SequenceInputStream(Enumeration<? extends InputStream&g ...
- JAVA List根据字段排序以及取前几条数据
1.经常会遇到对组装的list排序或提取list中前几条数据,例如: 根据时间排序: list.sort((o1, o2) -> o2.getCreateTime().compareTo(o1. ...
- Java中如何实现j并发更新数据库同一条数据
分情况来说:普通单应用并发.多应用或多台服务器并发 情况一:普通单应用并发 使用关键字synchronized就可实现. 情况二:多应用或多台服务器并发 因多个应用之间并非同一个jvm(应用)内,因此 ...
- [五]java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用
reduce-归约 看下词典翻译: 好的命名是自解释的 reduce的方法取得就是其中归纳的含义 java8 流相关的操作中,我们把它理解 "累加器",之所以加引号是因为他并不仅仅 ...
- Java 8 新特性-菜鸟教程 (5) -Java 8 Stream
Java 8 Stream Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据. Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种 ...
- java.util.stream 库简介
Java Stream简介 Java SE 8 中主要的新语言特性是拉姆达表达式.可以将拉姆达表达式想作一种匿名方法:像方法一样,拉姆达表达式具有带类型的参数.主体和返回类型.但真正的亮点不是拉姆达表 ...
- Java 8 Stream流编程学习
本文是自己学习菜鸟教程中总结的笔记,用于快速找代码,完整的文档见菜鸟教程:Java 8 Stream Stream 使用一种类似用SQL语句从数据库查询数据的直观方式来提供一种对Java集合运算和表达 ...
随机推荐
- RabbitMQ (五):死信队列
什么是TTL RabbitMQ的TTL全称为Time-To-Live,表示的是消息的有效期.消息如果在队列中一直没有被消费并且存在时间超过了TTL,消息就会变成了"死信" (Dea ...
- FZU ICPC 2020 寒假训练 4 —— 模拟(一)
P1042 乒乓球 题目背景 国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及.其中11分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役.华华 ...
- 问题 B: 喷水装置(二)(在c++上运行有错误,提交AC了)
题目描述 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的喷水装置,每个喷水装置i喷水的效果是让以它为中心半径为Ri的圆都被润湿.请在给出的喷水装 ...
- IDEA Plugin,写一个看股票指数和K线的插件
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 没招了,不写点刺激的,你总是不好好看! 以前,我不懂.写的技术就是技术内容,写的场景 ...
- dart系列之:在dart中使用packages
目录 简介 pubspec.yaml get packages 使用packages 升级依赖 总结 简介 java中使用jar包来封装有用的功能,然后将其分发到maven仓库中,供其他人使用.同样的 ...
- vite2 + vite.config.js 比较坑的环境变量,vite2模式的使用
想在vite.config.js 里面判断一下环境,看看是不是开发环境,查了一下官网(https://cn.vitejs.dev/guide/env-and-mode.html),说是 可以使用 im ...
- 第02章_MySQL环境搭建
第02章_MySQL环境搭建 1. MySQL的卸载 步骤1:停止MySQL服务 在卸载之前,先停止MySQL8.0的服务.按键盘上的"Ctrl + Alt + Delete"组合 ...
- 快速入门上手JavaScript中的Promise
当我还是一个小白的时候,我翻了很多关于Promise介绍的文档,我一直没能理解所谓解决异步操作的痛点是什么意思 直到我翻了谷歌第一页的所有中文文档我才有所顿悟,其实从他的英文字面意思理解最为简单粗暴 ...
- CF1444C Team-Building
考虑我们判定二分图染色的经典算法: 染色. 我们把所有不同颜色块之间的边都保存下来. 只在图中保留相同颜块之间的边,并对其染色. 我们考虑记\(g_i\)为一个点的所在联通块编号,\(f_i\)为他在 ...
- P3722 [AH2017/HNOI2017]影魔(单调栈+扫描线+线段树)
题面传送门 首先我们把这两个贡献翻译成人话: 区间 \([l,r]\) 产生 \(p_1\) 的贡献当且仅当 \(a_l,a_r\) 分别为区间 \([l,r]\) 的最大值和次大值. 区间 \([l ...