当前位置:首页 > 科技  > 软件

一文搞懂 Java8 reduce操作

来源: 责编: 时间:2023-12-21 17:11:55 374观看
导读什么是 reduceJava8 中有两大最为重要的改变,其一是 Lambda 表达式,另一个就是 Stream API 了。Stream 是 Java8 中处理集合的关键抽象概念,它将数据源流化后,可以执行非常复杂的查找、过滤和映射数据、排序、切片、聚合

什么是 reduce

Java8 中有两大最为重要的改变,其一是 Lambda 表达式,另一个就是 Stream API 了。1Gr28资讯网——每日最新资讯28at.com

Stream 是 Java8 中处理集合的关键抽象概念,它将数据源流化后,可以执行非常复杂的查找、过滤和映射数据、排序、切片、聚合统计等操作。操作之后会产生一个新的流,而数据源则不会发生改变。1Gr28资讯网——每日最新资讯28at.com

在使用 Stream 操作的过程中,往往有三个步骤,1Gr28资讯网——每日最新资讯28at.com

1. 创建 Stream

从一个数据源(集合,数组)中,新建一个 Stream 流。1Gr28资讯网——每日最新资讯28at.com

2. 中间操作

一个中间操作链,对 Stream 流的数据进行处理。比如查找、过滤、映射转换等。1Gr28资讯网——每日最新资讯28at.com

3. 终止操作

一个终止操作,执行中间操作链,并产生结果。常用的终止操作有 forearch、collect、match、count、min、max、reduce 等。1Gr28资讯网——每日最新资讯28at.com

其中本文主要讲解的 reduct 操作就属于是 Stream 流操作中的终止操作。1Gr28资讯网——每日最新资讯28at.com

reduce 操作是一种通用的归约操作,它可以实现从 Stream 中生成一个值,其生成的值不是随意的,而是根据指定的计算模型。1Gr28资讯网——每日最新资讯28at.com

比如终止操作中提到 count、min 和 max 方法,因为常用而被纳入标准库中。事实上这些方法都是一种 reduce 操作。1Gr28资讯网——每日最新资讯28at.com

本文大纲如下,1Gr28资讯网——每日最新资讯28at.com

图片图片1Gr28资讯网——每日最新资讯28at.com

reduce 操作三要素

为了方便大家理解 reduce (规约)操作,先给大家演示一下 reduce 操作的相关代码示例,1Gr28资讯网——每日最新资讯28at.com

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);int result = numbers  .stream()  .reduce(0, (subtotal, element) -> subtotal + element);assertThat(result).isEqualTo(21);

可以看到,我们的 reduce 操作接受了三个参数,返回了一个 int 基本类型。1Gr28资讯网——每日最新资讯28at.com

在 Stream API 中,提供了三个 reduct 操作方法,根据参数不同进行区分。1Gr28资讯网——每日最新资讯28at.com

图片图片1Gr28资讯网——每日最新资讯28at.com

对应上方代码示例,也就是使用了接受两个参数的 reduce 方法,但其实接受两个参数的 reduce 方法的代码逻辑是和接受三个参数的 reduce 方法是一致的。通过上方截图可以看出。1Gr28资讯网——每日最新资讯28at.com

所以这里,我就直接给大家介绍下 reduce 操作的三个参数分别有什么作用即可。1Gr28资讯网——每日最新资讯28at.com

identiy 参数

identiy(初始值)是 reduce 操作的初始值,也就是当元素集合为空时的默认结果。对应上方代码示例,也就是说 reduce 操作的初始值是 0。1Gr28资讯网——每日最新资讯28at.com

accumulator 参数

accumulator(累加器)是一个函数,它接受两个参数,reduce 操作的部分元素和元素集合中的下一个元素。它返回一个新的部分元素。在这个例子中,累加器是一个 lambda 表达式,它将集合中两个整数相加并返回一个整数:(a, b) -> a + b。1Gr28资讯网——每日最新资讯28at.com

combiner 参数

combiner(组合器)是一个函数,它用于在 reduce 操作被并行化或者当累加器的参数类型和实现类型不匹配时,将 reduce 操作的部分结果进行组合。在上面代码示例中,我们不需要使用组合器,因为上面我们的 reduce 操作不需要并行,而且累加器的参数类型和实现类型都是 Integer。1Gr28资讯网——每日最新资讯28at.com

为了方便大家理解 reduce 操作的内部逻辑,我给大家绘制了上面代码示例的执行示意图,如下,1Gr28资讯网——每日最新资讯28at.com

图片1Gr28资讯网——每日最新资讯28at.com

如何使用 reduce 操作

为了更好地理解初始值,累加器和组合器的功能,让我们看一些基本的例子。1Gr28资讯网——每日最新资讯28at.com

使用 reduce 查询整数集合的最小值

// 创建一个整数集合List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);// 找出集合中的最小值Integer min = numbers.stream().reduce((integer, integer2) -> {    if (integer < integer2) {        return integer;    } else {        return integer2;    }}).get();// 输出结果System.out.println(min); // 1

在这个例子中,我们使用了一个参数的 reduce 操作,它接受一个累加器函数。累加器函数会返回集合两个元素中,较小的元素。1Gr28资讯网——每日最新资讯28at.com

最终我们就可以找出集合中最小值 1。1Gr28资讯网——每日最新资讯28at.com

使用 reduce 操作拼接字符串列表

我们可以对一个字符串列表使用 reduce 操作,将它们拼接成一个单一的字符串:1Gr28资讯网——每日最新资讯28at.com

// 创建一个字符串列表List<String> letters = Arrays.asList ("a", "b", "c", "d", "e");// 使用 reduce 操作拼接字符串列表String result = letters  .stream ()  .reduce ("", (partialString, element) -> partialString + element);// 输出结果System.out.println (result); // abcde

在这个例子中,我们将初始值设为 "",累加器函数设为 (a, b) -> a + b,它表示将两个字符串拼接起来。1Gr28资讯网——每日最新资讯28at.com

我们可以看到,reduce 操作将累加器函数反复应用到列表中的每个元素上,得到最终的结果 abcde。1Gr28资讯网——每日最新资讯28at.com

使用并行流计算整数列表的总和

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5,6);// 使用并行流和 reduce() 方法计算整数列表的总和int result = numbers.parallelStream()        .reduce(0, (a, b) -> a + b, Integer::sum);// 输出结果System.out.println(result); // 21

在这个例子中,我们使用 parallelStream() 方法将列表转换为并行流,再使用 reduce() 方法对整数列表进行 reduce 操作,并使用 Integer::sum 作为合并函数 combiner,将并行计算的结果合并。1Gr28资讯网——每日最新资讯28at.com

使用并行流的好处能够充分利用多核 CPU 的优势,使用多线程加快对集合数据的处理速度。1Gr28资讯网——每日最新资讯28at.com

不过并行流也不是任何时候都可以使用的,并行流执行过程中实际按照多线程执行,多线程编程有的问题,并行流都有。1Gr28资讯网——每日最新资讯28at.com

比如多线程的线程安全,执行顺序等问题,并行流都是有的。这一点需要大家注意。1Gr28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-51255-0.html一文搞懂 Java8 reduce操作

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 这个17k star的拖拽库有点料

下一篇: 如何应对 RocketMQ 消息堆积

标签:
  • 热门焦点
  • SpringBoot中使用Cache提升接口性能详解

    环境:springboot2.3.12.RELEASE + JSR107 + Ehcache + JPASpring 框架从 3.1 开始,对 Spring 应用程序提供了透明式添加缓存的支持。和事务支持一样,抽象缓存允许一致地使用各
  • Java NIO内存映射文件:提高文件读写效率的优秀实践!

    Java的NIO库提供了内存映射文件的支持,它可以将文件映射到内存中,从而可以更快地读取和写入文件数据。本文将对Java内存映射文件进行详细的介绍和演示。内存映射文件概述内存
  • 如何通过Python线程池实现异步编程?

    线程池的概念和基本原理线程池是一种并发处理机制,它可以在程序启动时创建一组线程,并将它们置于等待任务的状态。当任务到达时,线程池中的某个线程会被唤醒并执行任务,执行完任
  • 使用LLM插件从命令行访问Llama 2

    最近的一个大新闻是Meta AI推出了新的开源授权的大型语言模型Llama 2。这是一项非常重要的进展:Llama 2可免费用于研究和商业用途。(几小时前,swyy发现它已从LLaMA 2更名为Lla
  • 一个注解实现接口幂等,这样才优雅!

    场景码猿慢病云管理系统中其实高并发的场景不是很多,没有必要每个接口都去考虑并发高的场景,比如添加住院患者的这个接口,具体的业务代码就不贴了,业务伪代码如下:图片上述代码有
  • 品牌洞察丨服务本地,美团直播成效几何?

    来源:17PR7月11日,美团App首页推荐位出现&ldquo;美团直播&rdquo;的固定入口。在直播聚合页面,外卖&ldquo;神枪手&rdquo;直播间、美团旅行直播间、美团买菜直播间等均已上线,同时
  • 引领旗舰级影像能力向中端机普及 OPPO K11 系列发布 1799 元起

    7月25日,OPPO正式发布K系列新品—— OPPO K11 。此次 K11 在中端手机市场长期被忽视的影像板块发力,突破性地搭载索尼 IMX890 旗舰大底主摄,支持 OIS
  • 苹果140W USB-C充电器:采用氮化镓技术

    据10 月 30 日 9to5 Mac 消息报道,当苹果推出新的 MacBook Pro 2021 时,该公司还推出了新的 140W USB-C 充电器,附赠在 MacBook Pro 16 英寸机型的盒子里,也支
  • 电博会与软博会实现"线下+云端"的双线融合

    在本次“电博会”与“软博会”双展会利好条件的加持下,既可以发挥展会拉动人流、信息流、资金流实现快速交互流动的作用,继而推动区域经济良性发展;又可以聚
Top