java8的list分组-类字段分组-及分组后排序

2023-05-16

jdk8(java8),list 集合 分组,stream 流处理,groupingBy 使用
为了实现 分组后排序,增加 sorted 使用,先排序在分组,就能保证 分组后排序的效果

两种分组方式的代码

参考
Stream流使用groupingBy+mapping实现对分组之后的对象集合转化为对象的某个属性的集合

测试代码

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * Stream流使用groupingBy+mapping实现对分组之后的对象集合转化为对象的某个属性的集合
 *
 * @version v1.0
 * @date 2021/8/16
 */
public class GroupListTest {
    public static void main(String[] args) {
        List<P> list = new ArrayList<>();
        list.add(new P().name("你").type("女"));
        list.add(new P().name("我").type("男"));
        list.add(new P().name("他").type("男"));
        list.add(new P().name("她").type("女"));
        System.out.println("源>:"+list);
        Map<String, List<P>> groupMap1 = list.stream()
                .collect(Collectors.groupingBy(P::getType));
        System.out.println("简单分组>:"+groupMap1);
        Map<String, Set<String>> groupMap2 = list.stream()
                .collect(Collectors.groupingBy(P::getType, Collectors.mapping(P::getName, Collectors.toSet())));
        System.out.println("指定字段分组>:"+groupMap2);
    }
    public static class P{
        private String name,type;

        public String getName() { return name; }
        public void setName(String name) { this.name = name; }
        public P name(String name) { this.name = name; return this; }
        public String getType() { return type; }
        public void setType(String type) { this.type = type; }
        public P type(String type) { this.type = type; return this; }

        @Override
        public String toString() {
            return "P{ name='" + name + "', type='" + type + "'}";
        }
    }
}

输出

源>:[P{ name='你', type='女'}, P{ name='我', type='男'}, P{ name='他', type='男'}, P{ name='她', type='女'}]

简单分组>:{女=[P{ name='你', type='女'}, P{ name='她', type='女'}], 男=[P{ name='我', type='男'}, P{ name='他', type='男'}]}

指定字段分组>:{女=[你, 她], 男=[我, 他]}

截图
在这里插入图片描述

增加排序后分组

import java.util.*;
import java.util.stream.Collectors;

/**
 * Stream流使用groupingBy+mapping实现对分组之后的对象集合转化为对象的某个属性的集合
 * @author zy
 * @version v1.0
 * @date 2021/8/16
 */
public class GroupListTest {
    public static void main(String[] args) {
        List<P> list = new ArrayList<>();
        list.add(new P().no(0).age(21).name("你").type("女"));
        list.add(new P().no(2).age(31).name("我").type("男"));
        list.add(new P().no(1).age(22).name("他").type("男"));
        list.add(new P().no(null).age(30).name("她").type("女"));
        list.add(new P().no(3).age(33).name("她1").type("女"));
        System.out.println("源>:"+list);
        Map<String, List<P>> groupMap1 = list.stream()
                .collect(Collectors.groupingBy(P::getType));
        System.out.println("简单分组>:"+groupMap1);
        Map<String, Set<String>> groupMap2 = list.stream()
                .collect(Collectors.groupingBy(P::getType, Collectors.mapping(P::getName, Collectors.toSet())));
        System.out.println("指定字段分组>:"+groupMap2);
        Map<String, List<P>> groupMap3 = list.stream()
                .sorted(Comparator.comparing(P::getNo,Comparator.nullsLast(Integer::compareTo)))
                .collect(Collectors.groupingBy(P::getType, Collectors.toList()));
        System.out.println("排序后指定字段分组>:"+groupMap3);
    }
    public static class P{
        private String name,type;
        private Integer no,age;

        public String getName() { return name; }
        public void setName(String name) { this.name = name; }
        public P name(String name) { this.name = name; return this; }
        public String getType() { return type; }
        public void setType(String type) { this.type = type; }
        public P type(String type) { this.type = type; return this; }

        public void setAge(Integer age) { this.age = age; }
        public Integer getAge() { return age; }
        public P age(Integer age) { this.age = age; return this; }
        public void setNo(Integer no) { this.no = no; }
        public Integer getNo() { return no; }
        public P no(Integer no) { this.no = no; return this; }

        @Override
        public String toString() {
            return "P{ no='" + no + "', name='" + name + "', age=" + age + ", type='" + type + "'}";
        }
    }
}

输出

源>:[P{ no='0', name='你', age=21, type='女'}, P{ no='2', name='我', age=31, type='男'}, P{ no='1', name='他', age=22, type='男'}, P{ no='null', name='她', age=30, type='女'}, P{ no='3', name='她1', age=33, type='女'}]
简单分组>:{女=[P{ no='0', name='你', age=21, type='女'}, P{ no='null', name='她', age=30, type='女'}, P{ no='3', name='她1', age=33, type='女'}], 男=[P{ no='2', name='我', age=31, type='男'}, P{ no='1', name='他', age=22, type='男'}]}
指定字段分组>:{女=[你, 她1, 她], 男=[我, 他]}
排序后指定字段分组>:{女=[P{ no='0', name='你', age=21, type='女'}, P{ no='3', name='她1', age=33, type='女'}, P{ no='null', name='她', age=30, type='女'}], 男=[P{ no='1', name='他', age=22, type='男'}, P{ no='2', name='我', age=31, type='男'}]}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java8的list分组-类字段分组-及分组后排序 的相关文章

  • SONY VAIO P VPCP118KJ索尼酷袋本 鸡肋上网本初体验

    随着消费者市场需求的不断多样化和个性化 xff0c 个人电脑厂家开始不断突破创新 xff0c 在产品线拼装出各种各样的个人电脑 xff0c 主打性能的游戏本 xff0c 主打便携轻薄本 xff0c 2009年的CES上索大法推出了一款与众不
  • 第2课【CMSIS和标准库开发】标准库 CMSIS 分层

    目录 基本知识框架课堂笔记CMSISCMSIS的分层关系和作用CMSIS层文件结构内核函数层文件外设函数访问层文件 标准库开发标准库开发 LED GPIO标准库开发 KEY GPIO标准库开发 位带操作位带位带位带别名区位带区和位带别名区的
  • 第4课【STM32的时钟】时钟 时钟源 内外部时钟 高低速时钟

    目录 基本知识框架课堂笔记时钟什么是时钟 xff1f 时钟有什么作用 时钟源HSE 外部高速时钟HSI 内部高速时钟LSE 外部低速时钟LSI 内部低速时钟PLL锁相环 主要时钟和其他时钟主要时钟其他时钟 配置系统时钟实验 基本知识框架Xm
  • 第7课【SysTick定时器】中断 系统定时器 寄存器

    目录 基本知识框架课堂笔记SysTick定时器简介什么是SysTick定时器SysTick定时器的作用 SysTick寄存器CTRL控制及状态寄存器LOAD重装载数值寄存器VALUE当前数值寄存器CALIB校准数值寄存器 SysTick实战
  • 第8课【通讯的基本概念】串行并行 单工半双工全双工 同步异步 比特率波特率

    目录 基本知识框架课堂笔记通讯传送方式串行通讯并行通讯串行通讯与并行通讯的特性 通讯方向单工通讯半双工通讯全双工通讯 同步方式同步通讯异步通讯同步通讯与异步通讯的区别 传输单位比特率波特率比特率和波特率的联系 通讯简介通讯标准 基本知识框架
  • 嵌入式宏定义中do...while(0)的意义

    目录 背景do while 0 形式宏定义使得宏定义拥有一些函数的特点 分析1 封装 xff1a 使得宏定义可以包含复杂的内容而不容易出错 xff0c 提高代码健壮性2 生命周期 xff1a 宏定义内 外部定义的同名变量不会冲突3 返回 x
  • 第9课【USB协议】USB总线 接口 端点 管道 数据包 枚举 STM32_USB-FS-Device_Lib V4.1.0

    目录 简介背景特点版本 数据流模型总线拓扑结构主 从设备通信流端点管道 物理层接口类型USB Type AUSB Type BUSB Type C 引脚定义4PIN9PIN5PIN24PIN16PIN6PIN 电平标准 协议层 通讯方式通讯
  • 第10课【STM32 USB通讯协议实战】HID键盘+CDC虚拟串口组合设备

    目录 前言USB设备类别未定义设备设备描述符 配置描述符分析配置从机类型配置设备专用的描述符配置从机端点实现设备类特定请求 HID设备特点HID键盘描述符实例HID报文描述符短条目报文生成HID键盘报文描述符实例总结 CDC设备特点CDC
  • 创建 std_srvs::Empty 型 Service (参数为空的服务)

    参考 xff1a ros NodeHandle advertiseService API docs 1 包含头文件 include lt std srvs Empty h gt 2 创建服务 xff0c 并绑定服务的回调函数 restart
  • stm32串口+DMA环形缓冲收发保姆级

    基于HAL库的STM32串口DMA环形缓冲收发实例 首先在此感谢开源项目 xff0c 以及大佬们的无私奉献 xff0c 让每一个逐梦人能够免费学习 xff0c 再次感谢 xff01 发布只为记录 xff0c 记性不够 xff0c 笔记来凑
  • NX串口通讯windows

    我用windows与NX进行通讯 xff0c 用的线是CH340下载线 USB端连接windows xff0c 绿色的TXD连接NX的10号 RXD xff0c 白色的RXD连接NX的8号 TXD 目录 1 windows端 2 NX端 2
  • 串口接收 DMA FIFO 双缓冲区配置 + 单色OLED屏幕灰度图像显示的抖动算法

    适用于单色OLED屏幕图像显示的抖动算法 Visual studio c 43 43 STM32F4070 96寸单色IIC通信OLED5级灰度串口DMA 双缓冲github 抖动算法原理 DITHER抖动算法是指灰度可以用一定比例的黑白点
  • HTTP请求报文与响应报文

    一 HTTP的请求报文格式 xff1a HTTP的请求报文内容包括 xff1a 请求行 request line 请求头部 header 空行 和 请求数据 request data 四个部分组成 请求行主要包括 xff1a 请求方法 UR
  • c++中char转换为string类型

    写程序遇到一个Bug如下 xff1a char x 61 39 a 39 string str x 这里报错了 当时就有点蒙了 xff0c 查了下string的构造函数 xff1a string string const string am
  • C语言——内存管理问题

    常见的内存错误及解决方法 一 结构体成员指针未初始化 eg span class token macro property span class token directive hash span span class token dire
  • 大端存储和小端存储

    一 大端存储 高字节数据存储在低地址 二 小端存储 低字节数据存储在低地址 注意 xff1a 无论是大端存储还是小端存储 xff0c 读取到的数据为0x0102030405 三 大端存储或小端存储都是由系统设定的 xff0c 其二者区别在于
  • 多播的概念

    一 多播概述 多播 xff1a 数据的收发仅仅在同一组中进行 xff08 相当于我往一个群里发 xff0c 只有加入这个群的人才能收到 xff09 多播的特点 xff1a 多播地址标示一组接口 多播可以用于广域网使用 在IPv4 xff0c
  • 利用C语言编写一个网络分析器

    一 链路层数据格式 mac报文 xff1a 14个字节 二 IP数据报文格式 三 TCP数据报文格式 四 UDP数据报文格式 五 demo xff08 网络分析器 xff09 recvfrom接收链路层帧数据 xff0c 不经过网络层 传输
  • ARP攻击代码(ARP欺骗)

    一 ARP攻击 ARP欺骗攻击原理 xff1a ARP欺骗攻击建立在局域网主机间相互信任的基础上的 比如 xff1a 假设A B C在同一个局域网中 xff0c 网关为192 168 43 1 xff0c IP地址和MAC地址分别假设如下
  • 使用wireshark抓包并分析TCP三次握手

    一 实验过程 1 TCP包抓取及分析过程 确认使用的协议 xff0c 使用HTTP服务 选择https www baidu com 作为目标地址 启动Wireshark软件 xff0c 点击开始抓包后 在浏览器地址输入https www b

随机推荐