【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集合运算和表达 ...
随机推荐
- 我罗斯方块第二次作业(Block类)
负责任务 完善Block类的相关函数及变量: 对Block类的函数功能进行调试: github项目地址. 开发日记 2020.5.11 今天和朋友们讨论了如何分工的工作,我负责的部分是Block类的完 ...
- 华为开发者大会主题演讲:3D建模服务让内容高效生产
内容来源:华为开发者大会2021 HMS Core 6 Graphics技术论坛,主题演讲<3D建模服务使能3D内容高效生产>. 演讲嘉宾:华为消费者云服务 AI算法专家 3D建模服务(3 ...
- 大爽Python入门教程 3-3 循环:`for`、`while`
大爽Python入门公开课教案 点击查看教程总目录 for循环 可迭代对象iterable 不同于其他语言. python的for循环只能用于遍历 可迭代对象iterable 的项. 即只支持以下语法 ...
- python tkinter实现俄罗斯方块 基础版
本项目最终效果见本人b站投稿av81480858 简介部分 本项目最终代码已上传github: https://github.com/BigShuang/Tetris 的1_BASIC文件夹 .其中1 ...
- Nginx的try_files指令使用实例
Nginx的配置语法灵活,可控制度非常高.在0.7以后的版本中加入了一个try_files指令,配合命名location,可以部分替代原本常用的rewrite配置方式,提高解析效率. try_file ...
- HouseRobber
// // Created by Administrator on 2021/7/27. // #ifndef C__TEST01_HOUSEROBBER_HPP #define C__TEST01_ ...
- HelloWorld与java运行机制
HelloWorld 新建文件夹存放代码 新建一个java文件 文件后缀为.java Hello.java 注意文件拓展名改为java文件 编写代码 public class Hello{ #类名 p ...
- Mac Maven 安装及配置
一.下载 打开 Maven 官方下载页面:https://maven.apache.org/download.cgi#,点击下载链接即可开始下载: 以 Maven 3.8.4 为例,解压后可以 ...
- 洛谷 P4708 - 画画(Burnside 引理+组合数学)
洛谷题面传送门 神仙题 %%%%%%%%%%%%%%%%%%%% 题解搬运人来了 首先看到本质不同(无标号)的图计数咱们可以想到 Burnside 引理,具体来说,我们枚举一个排列 \(p\),并统计 ...
- CF1156F Card Bag
题目传送门. 题意简述:有 \(n\) 张卡牌,每张卡牌有数字 \(a_1,a_2,\cdots,a_n\).现在随机抽取卡牌,不放回,设本次抽到的卡牌为 \(x\),上次抽到的卡牌为 \(y\),若 ...