Stream流之reduce操作用法

news2025/1/17 6:16:00

Stream流之reduce操作用法

三种用法

    1 Optional<T> reduce(BinaryOperator<T> accumulator);
    2 T reduce(T identity, BinaryOperator<T> accumulator);
    3 <U> U reduce(U identity,
                 BiFunction<U, ? super T, U> accumulator,
                 BinaryOperator<U> combiner);
    

在这里插入图片描述
reduce是减少,降低意思,这个方法是流元素的累积汇总操作,它会将流中所有元素经过累积之后返回,不仅仅是加减乘除,按照一定逻辑,最终返回。
强调一下,这个 累积

累加器就是第一个元素,第二个元素和累加器操作之后,赋值给累加器,下一轮继续累加器和第三个元素操作,赋值给累加器,以此类推。

其中提供三个方法,方法2是方法1扩展,方法3是方法1,2扩展,同时方法3提供并行操作逻辑。
参数说明

    1 Optional<T> reduce(BinaryOperator<T> accumulator);

入参是函数式接口,是个累加器,继承了BiFunction<T,U,R>,两个输入,一个输出,T入参-累积操作对象,U入参-流元素对象,R返回值
入门

Optional<Integer> reduceResult = Stream.of(1,2,3).reduce((acc,item)->

{
  log.info("acc:【{}】",acc);
  log.info("item:【{}】",item);
  return acc+item;
}
log.info("reduceResult :【{}】",reduceResult.get() ); // 6

扩展

// initInfo初始化数据
Optional<User> reduceUser = initInfo.stream().reduce((acc,item)->{
   item.setScore(item.getScore().add(acc.getScore()));
   return item;
}
log.info("reduceUser:【{}】",reduceUser); // 分数累加后的结果组装对象

第二种用法

* @param identity the identity value for the accumulating function
* @param accumulator an <a href="package-summary.html#Associativity">associative</a>,
*                    <a href="package-summary.html#NonInterference">non-interfering</a>,
*                    <a href="package-summary.html#Statelessness">stateless</a>
*                    function for combining two values
* @return the result of the reduction
2 T reduce(T identity, BinaryOperator<T> accumulator);

入参:
第一个参数:初始值,指定类型
第二个参数:累加器对象数据
入门

Integer reduceResult = Stream.of(1,2,3).reduce(
0,
(acc,item)->

{
  log.info("acc:【{}】",acc);
  log.info("item:【{}】",item);
  return acc+item;
}

第三种方式

第一个参数:初始类型,数据,“T”
第二个参数:累加器对象
第三个参数:参数组合器combiner,接受lambda表达式,Stream是支持并发操作的,为了避免竞争,对于reduce线程都会有独立的result,combiner的作用在于合并每个线程的result得到最终结果。这也说明了了第三个函数参数的数据类型必须为返回数据类型
》因为第三个参数用来处理并发操作,如何处理数据的重复性,应多做考虑,否则会出现重复数据!

 ArrayList<Integer> accResult_s = Stream.of(1,2,3,4)
                .reduce(newList,
                        (acc, item) -> {
                            acc.add(item);
                            System.out.println("item: " + item);
                            System.out.println("acc+ : " + acc);
                            System.out.println("BiFunction");
                            return acc;
                        }, (acc, item) -> null);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/884974.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怎么提取人声消除背景音乐?教你提取人声方法

音频文件中通常会包含大量的背景音乐或噪音&#xff0c;这些噪音会影响人们对于音频内容的理解和感受。因此&#xff0c;提取出音频中的人声对于音频后期处理和相关应用非常重要。提取出音频中的人声可以用于进一步的音频处理&#xff0c;例如进行混音&#xff0c;让人声更加突…

UE4 Cesium 制作指定形状水域

找到该文件&#xff0c;复制它到项目目录中 找到该文件&#xff0c;同时也复制到项目目录中 如图所示 加这几个变量可以控制水体流动以及流速 加上Cesium Cartographic Polygon 拖动图中四个点&#xff0c;按住Alt&#xff0c;可以新增白色节点 在Cesium3DTileset内&#xff0…

拒绝摆烂!C语言练习打卡第二天

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;每日一练 &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、选择题 &#x1f4dd;1.第一题 &#x1f4dd;2.第二题 &#x1f4dd;…

【OFDM系列】DFT为什么能求频率幅度谱?DFT后的X[k]与x(n)幅度的关系?DFT/IDFT底层数学原理?

文章目录 问题引入铺垫一些小公式DFT公式证明DFT公式分解为4部分先考虑k10的情况:再考虑k1≠0的情况: DFT计算后&#xff0c;X(k)与x(n)的关系&#xff1a; Matlab FFT示例代码IDFT公式证明Matlab调用FFT/IFFT并绘图 问题引入 上面是DFT和IDFT的公式&#xff0c;IDFT先不谈。在…

使用原生小程序组件Picker自定义日期时间选择器

使用原生小程序组件Picker自定义日期时间选择器 1、 Picker简单介绍 可以看到Picker类型有5种&#xff0c; 具体可以查看微信开放文档 picker。 Picker&#xff08;选择器&#xff09;是一种常见的用户界面控件&#xff0c;用于从多个选项中选择一个或多个选项。在小程序中&…

2023开学季买什么电容笔好?推荐好用不贵的电容笔

眼见开学季马上就要来了&#xff0c;那么该选哪款电容笔比较好呢&#xff1f;一款苹果原装pencil的售价&#xff0c;已经达到了近千元&#xff0c;这个价格&#xff0c;在许多人看来&#xff0c;实在是太高了。其实&#xff0c;因为平替电容笔价格很实惠&#xff0c;只需一两百…

flutter 中的动画详解 全网最全 动画一篇搞定 一万四千字

flutter 中的动画详解 全网最全 动画一篇搞定 前言一、 基础概念二、 隐式动画三、 显示动画四、 过渡五、 手势动画六、 复杂动画七、 自定义动画八、 物理动画九、 Flutter 动画库十、 动画性能和优化十一、 第三方动画库总结 前言 学习 Flutter 中的动画和过渡是构建流畅用户…

问道管理:2018年以来最低水平,A股质押风险大幅缓解

2018年A股质押巅峰期之后&#xff0c;金融监管“组合拳”继续发力&#xff0c;多地政府及金融安排活跃参加纾困&#xff0c;上市公司股票质押危险化解取得本质成效。A股上市公司现在质押股数量、质押市值、质押份额均降至2018年以来最低水平。 股权质押融资是出质人将股权作为质…

CentOS系统环境搭建(十四)——CentOS7.9安装elasticsearch-head

centos系统环境搭建专栏&#x1f517;点击跳转 关于node的安装请看上一篇CentOS系统环境搭建&#xff08;十三&#xff09;——CentOS7安装nvm&#xff0c;&#x1f517;点击跳转。 CentOS7.9安装elasticsearch-head 文章目录 CentOS7.9安装elasticsearch-head1.下载2.解压3.修…

0基础学习VR全景平台篇 第85篇:智慧眼-如何分配角色的权限?

一、功能说明 角色权限&#xff0c;是指给智慧眼的所有角色成员分配具体的操作权限。 二、后台编辑界面 1、点击“添加权限”&#xff0c;选择其可操作的“权限”。注意权限只能逐项选择&#xff0c;所以如果某个角色拥有多项权限的话&#xff0c;那么需要进行多次添加。“快…

Threejs学习02——使用dat.gui实现主动控制立方体相关操作

使用dat.gui实现主动控制立方体相关操作 这是一个非常简单基础的threejs的学习应用&#xff01;在上一章学习threesj中我们实现立方体在坐标轴中来回移动&#xff0c;那都是通过我们的代码写死的效果&#xff0c;然后立方体的颜色都是通过代码写死的&#xff0c;这一章我们来给…

从零开始学习 Java:简单易懂的入门指南之MAth、System(十二)

常见API&#xff0c;MAth、System 1 Math类1.1 概述1.2 常见方法1.3 算法小题(质数)1.4 算法小题(自幂数) 2 System类2.1 概述2.2 常见方法 1 Math类 1.1 概述 tips&#xff1a;了解内容 查看API文档&#xff0c;我们可以看到API文档中关于Math类的定义如下&#xff1a; Math类…

大数据大数据架构发展史

1.背景 随着数据量的暴增和数据实时性要求越来越高&#xff0c;以及大数据技术的发展驱动企业不断升级迭代&#xff0c;传统数仓经历了以下发展过程&#xff1a;传统数仓架构 -> 离线大数据架构 -> Lambda架构 -> Kappa架构 -> 新一代实时数仓。&#xff08;大部分…

Vitis高层次综合学习——FPGA

高层次综合 什么是高层次综合&#xff1f;就是使用高级语言&#xff08;如C/C&#xff09;来编写FPGA算法程序。 在高层次综合上并不需要制定微架构决策&#xff0c;如创建状态机、数据路径、寄存器流水线等。这些细节可以留给 HLS 工具&#xff0c;通过提供输入约束&#xff…

ATX

导航 (返回顶部) 1. ATX (Advanced Technology Extended)2. 主板3. 电源 3.1 主要版本简表3.2 更换电源需要考虑的问题3.3 电源效率3.4 80 Plus 4. 退役的电源 4.1 24pin主供电接口4.2 12v的CPU供电接口4.3 12v的PCI-E供电接口4.4 SATA电源接口4.5 D型大4pin接口 1. ATX (Adv…

Android Studio Giraffe控制台乱码

这几天在使用Android Studio Giraffe进行一个App的开发&#xff0c;在项目构建的时候&#xff0c;控制台输出中文都是乱码&#xff0c;看着很不爽&#xff0c;进行了两项配置&#xff0c;中文就可以正常输出了&#xff0c;看起来就爽多了。 第一个配置&#xff1a;点击Help菜单…

冠达管理:A股利好!国家队最新出手!拜登紧急发声

号称“国家队”的大基金二期最新出手。 8月15日晚间&#xff0c;华润微公告&#xff0c;子公司润鹏半导体拟增资扩股并引进大基金二期等外部出资者&#xff0c;本次买卖完成后&#xff0c;润鹏半导体注册资本将由24亿元添加至150亿元。其间&#xff0c;大基金二期持股份额将达2…

uni-app根据经纬度逆解析详细地址

uni-app中的getLocation()方法可以获取到用户当前的地理位置&#xff08;经纬度&#xff09;、速度。 但是返回参数中的address在app中才会显示&#xff0c;小程序中不会显示&#xff0c;所以我们需要进行逆解析其地址&#xff0c;解析出它的地址信息。 1.首先要在腾讯位置服务…

解决多模块内核心模块有接口打包成jar后被依赖并调用遇到的问题(springcloud集成ruoyi.quartz)

项目准备开发个新功能&#xff0c;刚好很喜欢ruoyi写的任务调度&#xff0c;因此想到了集成ruoyi.quartz模块 &#xff0c;遇到了很多问题: 首先因为ruoyi.quartz模块依赖了ruoyi.common模块&#xff0c;因此第一步我需要把common模块一部分依赖项复制到了quartz模块内&#xf…

查看端口号被应用程序占用

打开资源监视器 找到被占用的端口&#xff0c;记住她的PID 打开任务管理器 把占用端口的程序关掉