List优雅分组

一、前言

最近小永哥发现,在开发过程中,经常会遇到需要对list进行分组,就是假如有一个RecordTest对象集合,RecordTest对象都有一个type的属性,需要将这个集合按type属性进行分组,转换为一个以type为key,RecordTest集合为value的Map对象,这个功能其实本身并不难,相信以老铁们的实力那还不是轻轻松松嘛,那下面小永哥就先献丑了。

二、代码实现

2.1、常规实现

实现思路:通过创建一个Map,然后遍历原RecordTest集合,在循环中先获取到type属性,然后判断该type属性在Map中是否存在,如果以存在,就从Map中通过key获取到一个list,然后将当前本次循环所操作的RecordTest对象add到这个list中。如果该type在Map中不存在,那么就新建一个list,将本次循环的RecordTest对象add进去,然后再以type为key,list为value的方式put进Map中,最后我们就获取到了一个以type分好组的Map对象了。

java 复制代码
package com.relation;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.map.MapUtil;
import com.alibaba.fastjson2.JSON;
import org.junit.jupiter.api.Test;

import java.util.List;
import java.util.Map;

/**
 * @author huhy
 * @version 1.0
 * @Description:
 * @ClassName Date:2025/5/20 21:50
 */
public class ListTest {

    @Test
    public void listGroupTest(){
        //模拟数据准备
        List<RecordTest> recordTestList = CollectionUtil.newArrayList();
        recordTestList.add(new RecordTest("型号A","item-code-A","item"));
        recordTestList.add(new RecordTest("型号B","item-code-B","item"));
        recordTestList.add(new RecordTest("文件A","file-code-B","file"));
        recordTestList.add(new RecordTest("文件B","file-code-B","file"));
        recordTestList.add(new RecordTest("文件C","file-code-C","file"));
        recordTestList.add(new RecordTest("图片A","photo-code-A","photo"));
        recordTestList.add(new RecordTest("视频A","video-code-C","video"));
        //按type属性进行分组
        Map<String,List<RecordTest>> recordTestGroupMap = MapUtil.newHashMap();
        for (RecordTest recordTest : recordTestList) {
            String type = recordTest.getType();
            List<RecordTest> recordTests;
            if(recordTestGroupMap.containsKey(type)){
                recordTests = recordTestGroupMap.get(type);
            }else {
                recordTests = CollectionUtil.newArrayList();
                recordTestGroupMap.put(type,recordTests);
            }
            recordTests.add(recordTest);
        }
        //打印
        System.out.println(JSON.toJSONString(recordTestGroupMap));
    }

    class RecordTest{
        private String name;
        private String code;
        private String type;

        public RecordTest(String name, String code, String type) {
            this.name = name;
            this.code = code;
            this.type = type;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getCode() {
            return code;
        }

        public void setCode(String code) {
            this.code = code;
        }

        public String getType() {
            return type;
        }

        public void setType(String type) {
            this.type = type;
        }
    }

}

打印出的信息不太方便观看,我们找个工具将JSON格式化一下,顺便提一句,有时候我们需要将JSON文本格式化的时候,是不是冷不丁还想不到什么好的方式,特别是开发环境还是内网的时候,没办法上网在线转?其实不管是内网还是外网开发环境,我们作为一个后端开发人员,postman可以说是标配,毕竟还得自测接口嘛,这时候postman就能发挥作用了,postman的post请求在输入参数以后,有一个Beautify的按钮,轻轻一点,JSON文本就格式化好了,非常方便。

这点小玩意儿虽然顺利实现了,而且实现代码也不孬,但是距离优雅还是差不少,下面我们换种嗨皮的实现方式。

2.2、优雅实现
java 复制代码
@Test
    public void listGroupTest(){
        //模拟数据准备
        List<RecordTest> recordTestList = CollectionUtil.newArrayList();
        recordTestList.add(new RecordTest("型号A","item-code-A","item"));
        recordTestList.add(new RecordTest("型号B","item-code-B","item"));
        recordTestList.add(new RecordTest("文件A","file-code-B","file"));
        recordTestList.add(new RecordTest("文件B","file-code-B","file"));
        recordTestList.add(new RecordTest("文件C","file-code-C","file"));
        recordTestList.add(new RecordTest("图片A","photo-code-A","photo"));
        recordTestList.add(new RecordTest("视频A","video-code-C","video"));
        //按type属性进行分组
        Map<String,List<RecordTest>> recordTestGroupMap = recordTestList.stream().collect(Collectors.groupingBy(RecordTest::getType));
        //打印
        System.out.println(JSON.toJSONString(recordTestGroupMap));
    }

三、结语

通过jdk1.8特性一行实现分组功能,代码量瞬间减少了10行,虽然现在节省的10行不算什么,但是积少成多,等真正开发的时候,我们可以把学到的东西都尽可能的付诸于实践,这样节省的就不仅仅是10行,可能就是成千上万行,我们的代码也会越来越精炼。

相关推荐
程序员的世界你不懂23 分钟前
Windows下allure与jenkins的集成
windows·servlet·jenkins
方博士AI机器人1 小时前
GNU Octave 基础教程(4):变量与数据类型详解(二)
windows·ubuntu·数据分析·octave
你们补药再卷啦8 小时前
windows,java后端开发常用软件的下载,使用配置
windows
板栗栗-79 小时前
Windows系统提示“mfc140u.dll丢失”?详细修复指南,一键恢复程序运行!
windows·dll·dll修复·dll错误·dll缺失
谢道韫6669 小时前
鸿蒙组件通用事件开发全攻略:从基础交互到工程实践
microsoft·交互·harmonyos
2401_8582861110 小时前
CD45.【C++ Dev】STL库的list的使用
开发语言·数据结构·c++·list
love530love11 小时前
Python 开发环境全栈隔离架构:从 Anaconda 到 PyCharm 的四级防护体系
运维·ide·人工智能·windows·python·架构·pycharm
fo安方11 小时前
运维的利器–监控–zabbix–第二步:建设–部署zabbix agent5.0--客户端是windows&centos系统--实操记录gys
运维·windows·zabbix
点云SLAM12 小时前
PyTorch 中Tensor常用数据结构(int, list, numpy array等)互相转换和实战示例
数据结构·人工智能·pytorch·算法·list·numpy·tensor
草明12 小时前
Python pip 以及 包的升级
windows·python·pip