Java8 用流收集数据之归约汇总

news2024/9/30 3:21:09

目录

  • 规约汇总
    • 最大值 (max)・最小值 (min)
    • 统计总数 (count)
    • 统计求和 (summingInt・summingLong・summingDouble・sum)
    • 平均值 (averagingInt・averagingLong・averagingInt・average)
    • 统计梗概 (summarizingInt・summarizingLong・summarizingDouble・summaryStatistics)
    • 连接字符串 (joining)
    • 广义的归约(reducing)

在这里插入图片描述

规约汇总

最大值 (max)・最小值 (min)

# 询卡路里最高的菜
Dish dish1 = Dish.menu.stream().max(Comparator.comparingInt(Dish::getCalories)).get();
Dish dish2 = Dish.menu.stream().max(Comparator.comparingLong(Dish::getCalories)).get();
Dish dish3 = Dish.menu.stream().max(Comparator.comparingDouble(Dish::getCalories)).get();

# 查询最高的卡路里
int    max = Dish.menu.stream().mapToInt(Dish::getCalories).max().getAsInt();
long   max = Dish.menu.stream().mapToLong(Dish::getCalories).max().getAsLong();
double max = Dish.menu.stream().mapToDouble(Dish::getCalories).max().getAsDouble();

# 仅了解即可:Collectors.reducing
Dish dish = menu.stream().collect(Collectors.reducing(BinaryOperator.maxBy(Comparator.comparingInt(Dish::getCalories)))).get();

在这里插入图片描述

统计总数 (count)

# count()
long count = Dish.menu.stream().count();

# 仅了解即可:Collectors.counting()
long count = Dish.menu.stream().collect(Collectors.counting());

在这里插入图片描述

统计求和 (summingInt・summingLong・summingDouble・sum)

# 获取所有菜的卡路里之和
int    total1   = Dish.menu.stream().mapToInt(Dish::getCalories).sum();
long   total2   = Dish.menu.stream().mapToLong(Dish::getCalories).sum();
double total3   = Dish.menu.stream().mapToDouble(Dish::getCalories).sum();

# 1. 如果流是空的,sum默认返回0
# 2. 求前3项和
int sum1 = Dish.menu.stream().mapToInt(Dish::getCalories).limit(3).sum(); 		  // 1+2+2=5 求前3项和
# 3. 求3到5项的和
int sum2 = Dish.menu.stream().mapToInt(Dish::getCalories).skip(2).limit(3).sum(); // 2+4+4=10 求3到5项的加和

# 仅了解即可:Collectors.summingInt
int    total1 	= Dish.menu.stream().collect(Collectors.summingInt(Dish::getCalories));
long   total2 	= Dish.menu.stream().collect(Collectors.summingLong(Dish::getCalories));
double total3   = Dish.menu.stream().collect(Collectors.summingDouble(Dish::getCalories));

在这里插入图片描述

平均值 (averagingInt・averagingLong・averagingInt・average)

# 获取所有菜的卡路里的平均值
double avg1 = Dish.menu.stream().mapToInt(Dish::getCalories).average().getAsDouble();
double avg2 = Dish.menu.stream().mapToLong(Dish::getCalories).average().getAsDouble();
double avg3 = Dish.menu.stream().mapToDouble(Dish::getCalories).average().getAsDouble();

# 仅了解即可:Collectors.averagingInt
double avg = Dish.menu.stream().collect(Collectors.averagingInt(Dish::getCalories));
double avg = Dish.menu.stream().collect(Collectors.averagingLong(Dish::getCalories));
double avg = Dish.menu.stream().collect(Collectors.averagingInt(Dish::getCalories));

在这里插入图片描述

统计梗概 (summarizingInt・summarizingLong・summarizingDouble・summaryStatistics)

# IntSummaryStatistics{count=9, sum=4300, min=120,average=477.777778, max=800}
# 获取所有菜的Statistic
IntSummaryStatistics    statistics1 = Dish.menu.stream().mapToInt(Dish::getCalories).summaryStatistics();
LongSummaryStatistics   statistics2 = Dish.menu.stream().mapToLong(Dish::getCalories).summaryStatistics();
DoubleSummaryStatistics statistics3 = Dish.menu.stream().mapToDouble(Dish::getCalories).summaryStatistics();

# 仅了解即可:Collectors.summarizingInt
IntSummaryStatistics    statistics  = Dish.menu.stream().collect(Collectors.summarizingInt(Dish::getCalories));
LongSummaryStatistics   statistics  = Dish.menu.stream().collect(Collectors.summarizingLong(Dish::getCalories));
DoubleSummaryStatistics statistics  = Dish.menu.stream().collect(Collectors.summarizingDouble(Dish::getCalories));

在这里插入图片描述

连接字符串 (joining)

joining在内部使用了StringBuilder来把生成的字符串逐个追加起来;

String shortMenu = menu.stream().map(Dish::getName).collect(Collectors.joining());
// 结果:porkbeefchickenfrench friesriceseason fruitpizzaprawnssalmon

String shortMenu = menu.stream().map(Dish::getName).collect(Collectors.joining(", "));
// 结果:pork, beef, chicken, french fries, rice, season fruit, pizza, prawns, salmon

在这里插入图片描述

广义的归约(reducing)

上文所有收集器,都是一个可以用reducing工厂方法定义的归约过程的特殊情况而已。

# 计算菜单总热量的归约过程
int totalCalories = menu.stream().collect(Collectors.reducing(0, Dish::getCalories, (i, j) -> i + j));
int totalCalories = menu.stream().collect(Collectors.reducing(0, Dish::getCalories, Integer::sum));
int totalCalories = menu.stream().map(Dish::getCalories).reduce(Integer::sum).get();
int totalCalories = menu.stream().mapToInt(Dish::getCalories).sum();
# 我们更倾向于最后一个解决方案,因为它最简明,也很可能最易读。同时,它也是性能最好的一个,因为IntStream可以让我们避免自动拆箱操作。

# 用reducing连接字符串
String shortMenu = menu.stream().collect(Collectors.reducing("", Dish::getName, (s1, s2) -> s1 + s2 ));
String shortMenu = menu.stream().map(Dish::getName).collect(Collectors.reducing((s1, s2) -> s1 + s2)).get();
String shortMenu = menu.stream().map(Dish::getName).collect(Collectors.joining());
# 就实际应用而言,不管是从可读性还是性能方面考虑,我们始终建议使用joining收集器。

-----------------------------------------------------------------------------读书笔记摘自 书名:Java 8实战 作者:[英] Raoul-Gabriel Urma [意] Mario Fusco [英] Alan M

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

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

相关文章

AI周报(9.22-9.28)

AI应用-Siipet宠物沟通师 Siipet是一款由SiiPet公司推出的创新宠物行为分析相机,旨在通过尖端技术加深宠物与主人之间的情感联系。这款相机利用先进的AI算法,能够自动识别和分析家中宠物的行为,并提供定制化的护理建议。 SiiPet相机的核心功…

益而益集团荣获2024年江苏省智能制造车间称号

近日,江苏省工信厅公示2024年江苏省智能制造车间名单,苏州益而益电器制造有限公司以其卓越的智能化转型成果,荣获2024年度江苏省级智能制造车间称号。 此次获评,是江苏省政府对益而益集团智能化高质量转型发展的认可及肯定&#…

活动在线报名小程序源码系统 自主提交表单+创建表单 带完整的安装代码包以及搭建部署教程

系统概述 随着各类活动的日益丰富和多样化,传统的报名方式逐渐显现出其局限性。纸质报名表格繁琐易错、人工统计费时费力,难以满足现代活动管理的需求。因此,开发一款集自主提交表单和创建表单功能于一体的活动在线报名小程序源码系统成为必…

mit6824-01-MapReduce详解

文章目录 MapReduce简述编程模型执行流程执行流程排序保证Combiner函数Master数据结构 容错性Worker故障Master故障 性能提升定制分区函数局部性执行缓慢的worker(slow workers) 常见问题总结回顾参考链接 MapReduce简述 MapReduce是一个在多台机器上并行计算大规模数据的软件架…

C++进阶知识2 多态

多态 1. 多态的概念2. 多态的定义及实现2.1 多态的构成条件2.1.2 虚函数2.1.3 虚函数的重写/覆盖2.1.5 虚函数重写的⼀些其他问题2.1.6 override和final关键字2.1.7 重载/重写/隐藏的对⽐ 3. 多态的原理3.2 多态的原理3.2.1 多态是如何实现的3.2.2 动态绑定与静态绑定3.2.3 虚函…

828华为云征文|部署在线文档应用程序 CodeX Docs

828华为云征文|部署在线文档应用程序 CodeX Docs 一、Flexus云服务器X实例介绍二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置2.4 Docker 环境搭建 三、Flexus云服务器X实例部署 CodeX Docs3.1 CodeX Docs 介绍3.2 CodeX Docs 部署3.3 CodeX…

SpringBoot整合JPA 基础使用

一、什么是JPA ‌‌1.JPA的定义和基本概念‌‌ ‌JPA(Java Persistence API)‌是Java中用于进行持久化操作的一种规范,它定义了一系列用于操作关系型数据库的API接口。通过这些接口,开发人员可以方便地进行数据库的增删改查等操…

ArcgisEngine开发中,Ifeatureclass.Addfield 报错0x80040655处理方法

1、ArcgisEngine开发中,Ifeatureclass.Addfield 报错0x80040655。如下图所示。 2、经分析,这是由于字段类型错误,经检查,是由于字段名为中文名,超出shp格式的最大字段长度量,看资料说是5个中文字符&#xf…

fastadmin 搜索提交重置按钮文本修改

默认 修改require-backend.min.js文件 效果 当然最好还是去需修改lang文件 效果 如果修改没生效记得清楚一下缓存,再刷新 完结 赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你…

校园跑腿系统二手市场校园搭子校园社团活动系统2000的和4800的有什么区别

校园跑腿系统、二手市场、校园搭子、校园社团活动系统在不同价格档位(如2000元和4800元)之间可能存在多方面的区别,这些区别主要体现在功能丰富性、技术支持、用户体验、定制化程度以及后续服务等方面。然而,由于具体的价格差异和…

TDengine 流计算与窗口机制的深度解析:揭示计数窗口的关键作用

在 TDengine 3.2.3.0 版本中,我们针对流式计算新增了计数窗口,进一步优化了流式数据处理的能力。本文将为大家解读流式计算与几大窗口的关系,并针对新增的计数窗口进行详细的介绍,帮助大家进一步了解 TDengine 流式计算&#xff0…

趣味SQL | 从围棋收官到秦楚大战的数据库SQL实现(下)

目录 0 上集回顾 1 双先量化,得失权衡 2 各守城池,妥协攻守 3 SQL演算,三策评详 4 寸土必争,利益倍增 5 SQL再演,策略精进 6 棋道相通,治国有术 如果觉得本文对你有帮助,那么不妨也可…

这是我见过最强的AI大模型教程书籍!免费白嫖,可以上车!!

这是LLM入门级书籍,共145页,主要介绍了大型语言模型(LLM)的基本原理和底层技术。 阅读本书,您将能够掌握 LLM 的基本概念,了解自然语言处理(NLP)的发展历程,理解 Transf…

家中浮毛太多怎么办?希喂、米家、安德迈更推荐哪款?

在现代养宠家庭生活中,宠物空气净化器已经成为不可或缺的家电之一。 而在众多空气净化器类型中,宠物空气净化器以其独特的设计和卓越的净化效果,逐渐赢得了越来越多养宠家庭的青睐。 它不仅能有效地吸附空中飞舞的浮毛,还能高效…

召回10 Deep Retrieval召回

Deep Retrieval召回:给定用户特征采用beam search算法召回路径,根据路径召回物品,对物品排序,最终用分数高的物品作为召回结果。 双塔模型是将向量表征作为用户和物品之间的中介。 Deep Retrieval是将路径作为用户和物品之间的中介…

基于Java+VUE+echarts大数据智能道路交通信息统计分析管理系统的设计与实现

大数据智能交通管理系统是一种基于Web的系统架构,通过浏览器/服务器(B/S)模式实现对城市交通数据的高效管理和智能化处理。该系统旨在通过集成各类交通数据,包括但不限于车辆信息、行驶记录、违章情况等,来提升城市管理…

场地预约系统小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,场地类型管理,场地信息管理,我的预约管理,场地使用管理 微信端账号功能包括:系统首页,场地信息,我的预约&a…

简易CPU设计入门:取指令(三),ip_buf与rd_en的非阻塞赋值

在开篇,还是请大家首先准备好本项目所用的源代码。如果已经下载了,那就不用重复下载了。如果还没有下载,那么,请大家点击下方链接,来了解下载本项目的CPU源代码的方法。 下载本项目代码 准备好了项目源代码以后&…

图形化编程-在DevC++中集成EasyX图形库

1、EasyX介绍 EasyX (EasyX Graphics Library)是针对 C/C++ 的图形库,可以帮助使用C/C++语言的程序员快速上手图形和游戏编程,可以用EasyX 很快的画一个房子,或者一辆移动的小车,也可以编写俄罗斯方块、贪吃蛇、黑白棋等小游戏,可以练习图形学的各种算法等等。 EasyX …

鸿蒙媒体开发系列15——图片解码(PixcelMap)

如果你也对鸿蒙开发感兴趣,加入“Harmony自习室”吧!扫描下方名片,关注公众号,公众号更新更快,同时也有更多学习资料和技术讨论群。 1、概述 应用开发中的图片开发是对图片像素数据进行解析、处理、构造的过程&#x…