iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >Java Stream流实现多字段分组groupingBy操作
  • 579
分享到

Java Stream流实现多字段分组groupingBy操作

java 2023-10-28 05:10:24 579人浏览 独家记忆
摘要

近期的项目里,遇到一个需求:对于含有多个元素的List,按照其中的某几个属性进行分组,比如Report::getPersonID、Report::getSchoolYear、Report::getDa

近期的项目里,遇到一个需求:对于含有多个元素的List,按照其中的某几个属性进行分组,比如Report::getPersonID、Report::getSchoolYear、Report::getDataType等字段。下面就让我们讨论一下如何比较优雅的按多字段进行分组groupingBy。

  1. 利用单个字段进行分组
    如上面的Report类,如果对于其中的某一个字段进行分组(如PersonID),则比较简单,我们可以利用Stream.collect()和Collectors.groupingBy结合,即可进行分组groupingBy,代码如下:
public class TestGroupingBy {    public static void main(String[] args) {        List<Report> reportList = Arrays.asList(                new Person().setPersonID(1).setSchoolYear(2022).setDataType("本科")                //这里添加其他的对象,可以多添加一些        );        Map<String, List<Report>> groupingMap = reportList.stream().collect(Collectors.groupingBy(Person::getPersonID));}

其中的groupingMap ,类型为Map,第一个泛型为String即分组字段(本例中为personID字段)的类型,第二个泛型为List及分组结果的类型。
2. 利用多个字段进行分组
上面的例子是按单个字段分组,如果需要按照多个字段,如personID、schoolYear、dataType三个字段进行分组,同样也可以可以利用Stream.collect()和Collectors.groupingBy结合的方式进行分组,不过该方式中调用Collectors.groupingBy时需要多次嵌套调用,测试代码如下:

public class TestGroupingBy {    public static void main(String[] args) {        List<Report> reportList = Arrays.asList(                new Person().setPersonID(1).setSchoolYear(2022).setDataType("本科")                //这里添加其他的对象,可以多添加一些        );        // 多字段嵌套分组        Map<String, Map<Integer, Map<String, List<Report>>>> groupingMap = personList.stream().collect(                Collectors.groupingBy(Report::getPersonID,                         Collectors.groupingBy(Report::getSchoolYear,     Collectors.groupingBy(Report::getDataType)                        )                )        );    }}

其中groupingMap类型为Map>>,是一个嵌套了三层的Map,对应的泛型String/Integer/String分别为对应分组字段的类型,最后一层Map的value类型为List为实际分组后的数据集合类型。为方便查看数据,特意按JSON格式贴出数据如下:

{  "1": {    "2022": {      "本科": [        {          "id": 1,          "schoolYear": 20,          "dataType": "本科"        }      ]      }      }}
  1. 利用Collectors.groupingBy与Function结合对多字段分组进行优化
public class TestGroupingBy {    public static void main(String[] args) {        List<Report> reportList = Arrays.asList(                new Person().setPersonID(1).setSchoolYear(2022).setDataType("本科")        );        // 定义一个函数Function,该函数将元素对象映射到一个键的集合里        Function<Report, List<Object>> compositeKey = report->                Arrays.asList(report.getPersonID(), report.getSchoolYear(), report.getDataType());        // 分组        Map<List<Object>, List<Report>> groupingMap =                reportList.stream().collect(Collectors.groupingBy(compositeKey, Collectors.toList()));    }}

groupingMap数据仅仅只有一层,但是其键值Key却是一个List,里面包含了分组字段的值,数据按json格式贴出如下:

{  "[1, 2022, 本科]": [    {          "id": 1,          "schoolYear": 20,          "dataType": "本科"    }  ]}

由于Map只有一层,用该方式分组的结果,对于我们业务也是比较友好,代码里对数据处理起来也是比较方便的。可以看到,从代码书写角度以及分组处理后得到的结果,该方法都是最优雅的。

来源地址:https://blog.csdn.net/weixin_51517879/article/details/132100605

--结束END--

本文标题: Java Stream流实现多字段分组groupingBy操作

本文链接: https://www.lsjlt.com/news/513920.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java Stream流实现多字段分组groupingBy操作
    近期的项目里,遇到一个需求:对于含有多个元素的List,按照其中的某几个属性进行分组,比如Report::getPersonID、Report::getSchoolYear、Report::getDa...
    99+
    2023-10-28
    java
  • Java stream多字段分组(groupingBy)
    近期的项目里,遇到一个需求:对于含有多个元素的List,按照其中的某几个属性进行分组,比如Persion::getAge、Persion::getType、Persion::getGender等字段。下面就让我们讨论一下如何比较优雅的按...
    99+
    2023-08-21
    java 后端 stream
  • Stream流中的groupingBy分组操作
     code: //根据医院编号,查询医院所有科室信息 Department departmentQuery = new Department(); departmentQuery.setHoscode(hoscode); Example ...
    99+
    2023-09-01
    java mysql sql
  • Java stream 分组操作
    根据单/多字段分组 单字段分组可以直接使用指定字段,多字段分组则采用拼接Key的形式 单字段: //单字段分组Map singleAttr = list.stream().collect( Collectors...
    99+
    2023-08-31
    java stream
  • Java8使用stream流给List<Map<String,Object>>分组(多字段key)
    Java8使用stream流给List根据字段key分组 一、项目场景: 从已得到的List集合中,根据某一元素(这里指map的key)进行分组,筛选出需要的数据。 如果是SQL的话则使用group ...
    99+
    2023-09-07
    list java spring boot 后端
  • Java Stream流对多个字段进行排序
    谈起Java 8,不少熟悉它的人,都会知道有一个对我们帮助很大的新特性,没错,就是我们在项目中经常用到的stream,它对我们处理数据的过程中提供了很多的便利,而这边文章主要讲述stream的便利之一...
    99+
    2023-09-03
    java stream流对多字段进行排序
  • java8 stream多字段排序的实现
    很多情况下sql不好解决的多表查询,临时表分组,排序,尽量用java8新特性stream进行处理 使用java8新特性,下面先来点基础的 List<类> list; ...
    99+
    2024-04-02
  • Java8 Stream流多字段求和、汇聚的实例
    目录Stream流多字段求和、汇聚实现方法对象类型数据处理Map类型数据处理Stream分组求和使用笔记分组求和使用Stream流多字段求和、汇聚 实现方法 利用 Collector...
    99+
    2024-04-02
  • java8 stream的多字段排序实现(踩坑)
    关于java8 的stream排序用法这里不做多说,这里介绍下曾经在多字段排序时遇到过的一个坑。 需求:需要根据id去分组,然后取出每组中行号最大的一个对象值。 想到可以利用stre...
    99+
    2024-04-02
  • JAVA中IO操作的字节流和字符流实例分析
    这篇文章主要介绍了JAVA中IO操作的字节流和字符流实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JAVA中IO操作的字节流和字符流实例分析文章都会有所收获,下面我们一起来看看吧。IO操作字节流java...
    99+
    2023-06-29
  • 如何使用 PHP Stream 实现数据流操作
    标题:PHP Stream 数据流操作指南 在Web开发中,数据流操作是非常常见的操作,可以用于读取文件内容、发送HTTP请求、处理网络数据等功能。PHP提供了强大的Stream功能,...
    99+
    2024-04-02
  • Java集合Stream流操作的基本使用教程分享
    目录事前准备FilterSortedMapMatchCountReduce总结Java 中可以使用 java.util.Stream 对一个集合(实现了java.util.Colle...
    99+
    2023-02-21
    Java Stream流操作 Java Stream流
  • java中对List分段操作的实例
    java中对List分段操作的实例问题:假设A系统查询出来一个很大很大的List,现在B系统想要得到这个List来导出报表,但是B系统部署环境条件有限,内存容不下这么大一个List,这时候我们就需要把List切分,然后再一个一个导出了。如果...
    99+
    2023-05-31
    java list 分段
  • 一文详解Java中的Stream的汇总和分组操作
    目录前言一、查找流中的最大值和最小值二、汇总三、连接字符串四、分组1、分组2、多级分组3、按子组数据进行划分后记前言 在前面的文章中其实大家也已经看到我使用过collect(Coll...
    99+
    2024-04-02
  • java stream实现分组BigDecimal求和,自定义分组求和
    前言 随着微服务的发展,越来越多的sql处理被放到java来处理,数据库经常会使用到对集合中的数据进行分组求和,分组运算等等。 那怎么样使用java的stream优雅的进行分组求和或运算呢? 一、准备测试数据 这里测试数据学生,年龄类型...
    99+
    2023-08-16
    java jvm 开发语言
  • Java中IO操作字节流与字符流的示例分析
    这篇文章主要为大家展示了“Java中IO操作字节流与字符流的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java中IO操作字节流与字符流的示例分析”这篇文章吧。IO操作字节流java....
    99+
    2023-06-29
  • NumPy实现ndarray多维数组操作
    目录简介 创建ndarray ndarray的属性 ndarray中元素的类型转换 ndarray的数学运算 index和切片 基本使用 index with slice boole...
    99+
    2024-04-02
  • java中如何实现redis限流操作
    这篇文章给大家分享的是有关java中如何实现redis限流操作的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体操作如下。导入所需依赖<properties>   &nb...
    99+
    2023-06-21
  • JS数组操作大全对象数组根据某个相同的字段分组
    目录先说点废话目标对象数组准换后的对象数组编写函数的思路方法一方法二拓展————ES6的新方法Object.keys先说点废话 最近在...
    99+
    2022-11-13
    js对象数组根据字段分组 js对象数组 js数组操作
  • 如何用SQL实现字段拆分成多行
    这篇文章给大家介绍如何用SQL实现字段拆分成多行,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。把表中某字段根据分隔符拆分成N个字符串后,再用这N个字符串把这一行演变成N行。用SQL来解决这个问题非常烦琐!SQL里没有提...
    99+
    2023-06-03
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作