java8 GroupingBy 用法大全
java8中,Collectors.groupingBy 会用得比较多,对其常见用法做一个汇总
1,模拟数据
Item
import java.math.BigDecimal;public class Item {private String name;private Integer quantity;private BigDecimal price;public Item(String name, int quantity, BigDecimal price) {this.name = name;this.quantity = quantity;this.price = price;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getQuantity() {return quantity;}public void setQuantity(Integer quantity) {this.quantity = quantity;}public BigDecimal getPrice() {return price;}public void setPrice(BigDecimal price) {this.price = price;}
}
数据
public static List<Item> initData(){List<Item> items = Arrays.asList(new Item("apple", 20, new BigDecimal("4.99")),new Item("apple", 30, new BigDecimal("7.99")),new Item("apple", 10, new BigDecimal("9.99")),new Item("banana", 30, new BigDecimal("2.99")),new Item("banana", 20, new BigDecimal("6.99")),new Item("orange", 50, new BigDecimal("3.99")),new Item("orange", 20, new BigDecimal("8.99")),new Item("watermelon", 200, new BigDecimal("2.99")),new Item("watermelon", 100, new BigDecimal("5.99")),new Item("kiwi fruit", 40, new BigDecimal("5.88")),new Item("kiwi fruit", 20, new BigDecimal("8.88")));return items;}
2,用法
1,groupingBy
// 根据水果名称分组private static void groupingBy(){List<Item> items = initData();Map<String, List<Item>> itemGroupBy = ListUtils.emptyIfNull(items).stream()
.collect(Collectors.groupingBy(Item::getName));System.out.println(JSON.toJSONString(itemGroupBy));}
结果:
{"orange": [{"name": "orange","price": 3.99,"quantity": 50}, {"name": "orange","price": 8.99,"quantity": 20}],"banana": [{"name": "banana","price": 2.99,"quantity": 30}, {"name": "banana","price": 6.99,"quantity": 20}],"apple": [{"name": "apple","price": 4.99,"quantity": 20}, {"name": "apple","price": 7.99,"quantity": 30}, {"name": "apple","price": 9.99,"quantity": 10}],"kiwi fruit": [{"name": "kiwi fruit","price": 5.88,"quantity": 40}, {"name": "kiwi fruit","price": 8.88,"quantity": 20}],"watermelon": [{"name": "watermelon","price": 2.99,"quantity": 200}, {"name": "watermelon","price": 5.99,"quantity": 100}]
}
2,groupingCounting
// 统计水果的种类private static void groupingCounting(){List<Item> items = initData();Map<String, Long> itemGroupCount = ListUtils.emptyIfNull(items).stream()
.collect(Collectors.groupingBy(Item::getName, Collectors.counting()));System.out.println(JSON.toJSONString(itemGroupCount));}
结果
{"orange": 2,"banana": 2,"apple": 3,"kiwi fruit": 2,"watermelon": 2
}
3,groupingSum
// 统计各水果的总数量private static void groupingSum(){List<Item> items = initData();Map<String, Integer> itemGroupSum = ListUtils.emptyIfNull(items).stream()
.collect(Collectors.groupingBy(Item::getName,
Collectors.summingInt(Item::getQuantity)));System.out.println(JSON.toJSONString(itemGroupSum));}
结果
{"orange": 70,"banana": 50,"apple": 60,"kiwi fruit": 60,"watermelon": 300
}
4,groupingMax
// 统计各水果中数量最多的那个private static void groupingMax(){List<Item> items = initData();Map<String, Item> itemGroupMax = ListUtils.emptyIfNull(items).stream().collect(Collectors.groupingBy(Item::getName,Collectors.collectingAndThen(Collectors.maxBy(Comparator.comparingInt(Item::getQuantity)), Optional::get)));System.out.println(JSON.toJSONString(itemGroupMax));Map<String, Item> itemGroupMaxMap = ListUtils.emptyIfNull(items).stream().collect(Collectors.toMap(Item::getName, Function.identity(), BinaryOperator.maxBy(Comparator.comparingInt(Item::getQuantity))));System.out.println(JSON.toJSONString(itemGroupMaxMap));}
结果
{"orange": {"name": "orange","price": 3.99,"quantity": 50},"banana": {"name": "banana","price": 2.99,"quantity": 30},"apple": {"name": "apple","price": 7.99,"quantity": 30},"kiwi fruit": {"name": "kiwi fruit","price": 5.88,"quantity": 40},"watermelon": {"name": "watermelon","price": 2.99,"quantity": 200}
}
Collectors.collectingAndThen 聚合后再操作
其参数:
collectingAndThen(Collector<T,A,R> downstream, Function<R,RR> finisher)
5,grouping mapping
// 统计各水果的价格private static void groupingSet(){List<Item> items = initData();Map<String, Set<BigDecimal>> itemGroupSet = ListUtils.emptyIfNull(items).stream()
.collect(Collectors.groupingBy(Item::getName,Collectors.mapping(Item::getPrice, Collectors.toSet())));System.out.println(JSON.toJSONString(itemGroupSet));Map<String, List<BigDecimal>> itemGroupList = ListUtils.emptyIfNull(items).stream()
.collect(Collectors.groupingBy(Item::getName,Collectors.mapping(Item::getPrice, Collectors.toList())));System.out.println(JSON.toJSONString(itemGroupList));}
结果
{"orange": [3.99, 8.99],"banana": [2.99, 6.99],"apple": [7.99, 9.99, 4.99],"kiwi fruit": [5.88, 8.88],"watermelon": [2.99, 5.99]
}
6,groupingMap
// 统计各水果的数量对应价格private static void groupingMap(){List<Item> items = initData();Map<String, Map<Integer, BigDecimal>> itemGroupMap = ListUtils.emptyIfNull(items).stream()
.collect(Collectors.groupingBy(Item::getName,Collectors.toMap(Item::getQuantity, Item::getPrice, (x, y) -> x)));System.out.println(JSON.toJSONString(itemGroupMap));Map<String, Map<Integer, BigDecimal>> itemGroupMap2 = ListUtils.emptyIfNull(items).stream()
.collect(Collectors.groupingBy(Item::getName, Collectors.collectingAndThen(Collectors.toMap(Item::getQuantity, Item::getPrice), v -> v)));System.out.println(JSON.toJSONString(itemGroupMap2));}
结果
{"orange": {50: 3.99,20: 8.99},"banana": {20: 6.99,30: 2.99},"apple": {20: 4.99,10: 9.99,30: 7.99},"kiwi fruit": {20: 8.88,40: 5.88},"watermelon": {100: 5.99,200: 2.99}
}
第一种更为简便
7,groupingAvg
// 统计各水果的平均数量 int double long 三种类型private static void groupingAvg(){List<Item> items = initData();Map<String, Double> itemGroupAvg = ListUtils.emptyIfNull(items).stream().collect(Collectors.groupingBy(Item::getName,Collectors.averagingInt(Item::getQuantity)));System.out.println(JSON.toJSONString(itemGroupAvg));}
结果
{"orange": 35.0,"banana": 25.0,"apple": 20.0,"kiwi fruit": 30.0,"watermelon": 150.0
}
总结:
常见使用聚合再进行map处理,用于匹配数据。了解Collectors.collectingAndThen的用法,聚合后再进行操作。写不来,就分两步写,先完成,再优化。
相关文章:
java8 GroupingBy 用法大全
java8中,Collectors.groupingBy 会用得比较多,对其常见用法做一个汇总 1,模拟数据 Item import java.math.BigDecimal;public class Item {private String name;private Integer quantity;private BigDecimal price;public Item(String nam…...
vue_router__WEBPACK_IMPORTED_MODULE_1__.default is not a constructor
你所建立的项目 是 vue2x ,但是却下载了 vue-router4x 而 vue-router4x 适用于 vue3x 所以你需要卸载 vue-router4x,重新下载 vue-router3x 卸载: npm uninstall vue-router 安装:(3版本) npm i vue-router3...
前端html2canvas和dom-to-image实现截图功能
目录 需求 历劫过程 截图知识点 html2canvas 文档地址 封装 使用教程 dom-to-image-more 文档地址 封装 使用教程 解决跨域问题 以下是我花了大把时间,薅秃头得出来的最终结果, dom-to-image-more截图时间快到可以让复杂的页面仅需2-3S就能完成截图,内容有点多…...
Hadoop平台集群之间Hive表和分区的导出和导入迁移(脚本)
要编写Shell脚本实现两个Hadoop平台集群之间Hive表和分区的导出和导入迁移 你可以使用Hive的EXPORT和IMPORT命令结合Hadoop的DistCp命令。下面是一个示例脚本: #!/bin/bash# 导出源Hive表的数据到HDFS source_hive_table"source_db.source_table" targe…...
Linux C语言实践eBPF
手动编译了解过程 通过对关键步骤make Msamples/bpf的实践,我们已经可以编译出内核源码中提供的ebpf样例。但这还不够我们充分地理解这个编译过程,我们将这编译过程拆解一下,拆解成可以一步步执行的那种,首先是环境准备ÿ…...
垃圾回收标记阶段算法
1.标记阶段的目的 主要是在GC在前,判断出哪些是有用的对象,哪些是需要回收的对象,只有被标记为垃圾对象,GC才会对其进行垃圾回收。判断对象是否为垃圾对象的两种方式:引用计数算法和可达性分析算法。 2.引用计数算法…...
泰晓科技发布 Linux Lab v1.2 正式版
导读近日消息,Linux Lab 是一套用于 Linux 内核学习、开发和测试的即时实验室,官方称其“可以极速搭建和使用,功能强大,用法简单”。 自去年 12 月份发布 Linux Lab v1.1 后,v1.2 正式版目前已经发布于 GitHub 及 Gite…...
王道数据结构-代码实操1(全注解版)
#include<stdio.h>void loveyou(int n){ // 传入参数类型为int型,在此函数中表示为n;返回值类型为void,即没有返回值; int i1; //定义了一个整数型变量i,且只在loveyou函数中有用;while(i…...
flink写入到kafka 大坑解析。
1.kafka能不能发送null消息? 能! 2 flink能不能发送null消息到kafka? 不能! public static void main(String[] args) throws Exception {StreamExecutionEnvironment env StreamExecutionEnvironment.getExecutionEnvironment(…...
MATLAB算法实战应用案例精讲-【深度学习】预训练模型-Subword
目录 前言 Subword 1. Subword介绍 分词器是做什么的? 为什么需要分词? 分词方法...
【HarmonyOS】实现从视频提取音频并保存到pcm文件功能(API6 Java)
【关键字】 视频提取类Extractor、视频编解码、保存pcm文件 【写在前面】 在使用API6开发HarmonyOS应用时,通常会开发一些音视频媒体功能,这里介绍如何从视频中提取音频保存到pcm文件功能,生成pcm音频文件后,就可使用音频播放类…...
Linux:shell命令运行原理和权限的概念
文章目录 shell和kernelshell的概念和原理Linux的权限文件的权限文件的类型文件的权限管理权限的实战应用 shell和kernel 从狭义上来讲,Linux是一个操作系统,我们叫它叫kernel,意思是核心,核心的意思顾名思义,就是最关…...
Javascript -- 数组prototype方法探究
一、数组prototype方法探究 1、不改变原数组 1. concat() 这个是数组拼接方法,可以将两个数组或多个数组拼接并返回一个包含两个数组或多个数组内容的新数组,不会改变原数组 方法里面理论上可以写入n个参数, const arr [1,2]; var str …...
android stduio 打开工程后直接报Connection refused解决
报错如下:Connection refused 解决方案: 打开gradle-wrapper.properties修改distributionUrl 将: distributionUrlhttp\://localhost/gradle/distributions/gradle-6.5-bin.zip 替换为: distributionUrlhttps\://services.gradle.org/distributions/gradle-6.5-bin.zip 错…...
搜索与图论(一)
一、DFS与BFS 1.1深度优先搜索(DFS) DFS不具有最短性 //排列数字问题 #include<iostream> using namespace std;const int N 10; int n; int path[N]; bool st[N];void dfs(int u) {if(u n){for(int i 0;i < n;i) printf("%d",path[i]);puts("&qu…...
百题千解计划【CSDN每日一练】“小明投篮,罚球线投球可得一分”(附解析+多种实现方法:Python、Java、C、C++、C#、Go、JavaScript)
这个心上人,还不知道在哪里,感觉明天就会出现。 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌟[2] 2022年度博客之星人工智能领域TOP4🌟 🏅[3] 阿里云社区特邀专家博主🏅 🏆[4] CSDN-人工智能领域优质创作者�…...
lemon框架开发笔记
lemon框架开发笔记 JudgeUtils.isBlank() 字符串为 null 或者 "" ----返回true JudgeUtils.isNotBlankAll() 字符串全部不为 null 或者 "" ----返回true JudgeUtils.isBlankAll() 字符串全部为 null 或者 "" ----返回true// isBlank 是在isEmpt…...
Spark SQL快速入门
1. 了解Spark SQL 1.1 什么是Spark SQL Spark SQL是spark的一个模块,用于处理海量的结构化数据。 1.2 Spark SQL有什么特点?优点是什么? 特点: Spark SQL支持读取和写入多种格式的数据源,包括Parquet、JSON、CSV、…...
linux+Jenkins+飞书机器人发送通知(带签名)
文章目录 如何使用在linux 上安装python 环境发送消息python脚本把脚本上传倒linux上 jenkins 上执行脚本 如何使用 自定义机器人使用指南飞书官网https://open.feishu.cn/document/client-docs/bot-v3/add-custom-bot 在linux 上安装python 环境 yum install python3 python…...
react hooks
1 useEffect(setup,dependencies) 使用object.is来比较每个依赖项和它先前的值 依赖项为空数组的effect不会在组件任何props和state发生改变时重新运行 当useEffect依赖于外部传入props对象时,容易造成死循环 需要对依赖对象进行深比较 import { isEqual } from…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...
