在本页中,我们将提供 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. RabbitMQ (五):死信队列

    什么是TTL RabbitMQ的TTL全称为Time-To-Live,表示的是消息的有效期.消息如果在队列中一直没有被消费并且存在时间超过了TTL,消息就会变成了"死信" (Dea ...

  2. FZU ICPC 2020 寒假训练 4 —— 模拟(一)

    P1042 乒乓球 题目背景 国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及.其中11分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役.华华 ...

  3. 问题 B: 喷水装置(二)(在c++上运行有错误,提交AC了)

    题目描述 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的喷水装置,每个喷水装置i喷水的效果是让以它为中心半径为Ri的圆都被润湿.请在给出的喷水装 ...

  4. IDEA Plugin,写一个看股票指数和K线的插件

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 没招了,不写点刺激的,你总是不好好看! 以前,我不懂.写的技术就是技术内容,写的场景 ...

  5. dart系列之:在dart中使用packages

    目录 简介 pubspec.yaml get packages 使用packages 升级依赖 总结 简介 java中使用jar包来封装有用的功能,然后将其分发到maven仓库中,供其他人使用.同样的 ...

  6. vite2 + vite.config.js 比较坑的环境变量,vite2模式的使用

    想在vite.config.js 里面判断一下环境,看看是不是开发环境,查了一下官网(https://cn.vitejs.dev/guide/env-and-mode.html),说是 可以使用 im ...

  7. 第02章_MySQL环境搭建

    第02章_MySQL环境搭建 1. MySQL的卸载 步骤1:停止MySQL服务 在卸载之前,先停止MySQL8.0的服务.按键盘上的"Ctrl + Alt + Delete"组合 ...

  8. 快速入门上手JavaScript中的Promise

    当我还是一个小白的时候,我翻了很多关于Promise介绍的文档,我一直没能理解所谓解决异步操作的痛点是什么意思 直到我翻了谷歌第一页的所有中文文档我才有所顿悟,其实从他的英文字面意思理解最为简单粗暴 ...

  9. CF1444C Team-Building

    考虑我们判定二分图染色的经典算法: 染色. 我们把所有不同颜色块之间的边都保存下来. 只在图中保留相同颜块之间的边,并对其染色. 我们考虑记\(g_i\)为一个点的所在联通块编号,\(f_i\)为他在 ...

  10. P3722 [AH2017/HNOI2017]影魔(单调栈+扫描线+线段树)

    题面传送门 首先我们把这两个贡献翻译成人话: 区间 \([l,r]\) 产生 \(p_1\) 的贡献当且仅当 \(a_l,a_r\) 分别为区间 \([l,r]\) 的最大值和次大值. 区间 \([l ...