List优雅分组

news2025/7/19 16:53:14

一、前言

        最近小永哥发现,在开发过程中,经常会遇到需要对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对象了。

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、优雅实现

        

@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行,可能就是成千上万行,我们的代码也会越来越精炼。

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

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

相关文章

Linux 使用 Docker 安装 Milvus的两种方式

一、使用 Docker Compose 运行 Milvus (Linux) 安装并启动 Milvus Milvus 在 Milvus 资源库中提供了 Docker Compose 配置文件。要使用 Docker Compose 安装 Milvus&#xff0c;只需运行 wget https://github.com/milvus-io/milvus/releases/download/v2.5.10/milvus-standa…

AR眼镜+AI视频盒子+视频监控联网平台:消防救援的智能革命

在火灾现场&#xff0c;每一秒都关乎生死。传统消防救援方式面临信息滞后、指挥盲区、环境复杂等挑战。今天&#xff0c;一套融合AR智能眼镜AI视频分析盒子智能监控管理平台的"三位一体"解决方案&#xff0c;正在彻底改变消防救援的作业模式&#xff0c;为消防员装上…

编程技能:字符串函数10,strchr

专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏&#xff0c;故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 &#xff08;一&#xff09;WIn32 专栏导航 上一篇&#xff1a;编程技能&#xff1a;字符串函数09&#xff0c;strncmp 回到目录…

使用tunasync部署企业内部开源软件镜像站-Centos Stream 9

使用tunasync部署企业内部开源软件镜像站 tunasync 是清华大学 TUNA 镜像源目前使用的镜像方案&#xff0c;本文将介绍如何使用 tunasync 部署企业内部开源软件镜像站。 基于tunasync mirror-web nginx进行镜像站点搭建。 1. tunasync设计 tunasync架构如下&#xff1a; …

C++----Vector的模拟实现

上一节讲了string的模拟实现&#xff0c;string的出现时间比vector靠前&#xff0c;所以一些函数给的也比较冗余&#xff0c;而后来的vector、list等在此基础上做了优化。这节讲一讲vector的模拟实现&#xff0c;vector与模板具有联系&#xff0c;而string的底层就是vector的一…

Mac redis下载和安装

目录 1、官网&#xff1a;https://redis.io/ 2、滑到最底下 3、下载资源 4、安装&#xff1a; 5、输入 sudo make test 进行编译测试 会提示 ​编辑 6、sudo make install 继续 7、输入 src/redis-server 启动服务器 8、输入 src/redis-cli 启动测试端 1、官网&#xff…

[25-cv-05718]BSF律所代理潮流品牌KAWS公仔(商标+版权)

潮流品牌KAWS公仔 案件号&#xff1a;25-cv-05718 立案时间&#xff1a;2025年5月21日 原告&#xff1a;KAWS, INC. 代理律所&#xff1a;Boies Schiller Flexner LLP 原告介绍 原告是一家由美国街头艺术家Brian Donnelly创立的公司&#xff0c;成立于2002年2月25日&…

深度思考、弹性实施,业务流程自动化的实践指南

随着市场环境愈发复杂化&#xff0c;各类型企业的业务步伐为了跟得上市场节奏也逐步变得紧张&#xff0c;似乎只有保持极强的竞争力、削减成本、提升抗压能力才能在市场洪流中博得一席之位。此刻企业需要制定更明智的解决方案&#xff0c;以更快、更准确地优化决策流程。与简单…

UWB:litepoint获取txquality里面的NRMSE

在使用litepoint测试UWB,获取txquality里面的NRMSE时,网页端可以正常获取NRMSE。但是通过SCPI 命令来获取NRMSE一直出错。 NRMSE数据类型和pyvisa问题: 参考了user guide,发现NRMSE的数值是ARBITRARY_BLOCK FLOAT,非string。 pyvisa无法解析会返回错误。 查询了各种办法…

VUE npm ERR! code ERESOLVE, npm ERR! ERESOLVE could not resolve, 错误有效解决

VUE &#xff1a; npm ERR! code ERESOLVE npm ERR! ERESOLVE could not resolve 错误有效解决 npm install 安装组件的时候出现以上问题&#xff0c;npm版本问题报错解决方法&#xff1a;用上述方法安装完成之后又出现其他的问题 npm install 安装组件的时候出现以上问题&…

IoT/HCIP实验-1/物联网开发平台实验Part1(快速入门,MQTT.fx对接IoTDA)

文章目录 实验介绍设备接入IoTDA进入IoTDA平台什么是IoTDA 开通服务创建产品和设备定义产品模型&#xff08;Profile&#xff09;设备注册简思(实例-产品-设备) 模拟.与平台通信虚拟设备/MQTT.fx应用 Web 控制台QA用户或密码错误QA证书导致的连接失败设备与平台连接成功 上报数…

DMA STM32H7 Domains and space distrubution

DMA这个数据搬运工&#xff0c;对谁都好&#xff0c;任劳任怨&#xff0c;接受雇主设备的数据搬运业务。每天都忙碌着&#xff01;哈哈哈。 1. DMA 不可能单独工作&#xff0c;必须接收其他雇主的业务&#xff0c;所以数据搬运业务的参与者是DMA本身和业务需求发起者。 2. 一…

洪水危险性评价与风险防控全攻略:从HEC-RAS数值模拟到ArcGIS水文分析,一键式自动化工具实战,助力防洪减灾与应急管理

&#x1f50d; 洪水淹没危险性是洪水损失评估、风险评估及洪水应急和管理规划等工作的重要基础。当前&#xff0c;我国正在开展的自然灾害风险普查工作&#xff0c;对洪水灾害给予了重点关注&#xff0c;提出了对洪水灾害危险性及风险评估的明确要求。洪水危险性及风险评估通常…

Leetcode 3269. 构建两个递增数组

1.题目基本信息 1.1.题目描述 给定两个只包含 0 和 1 的整数数组 nums1 和 nums2&#xff0c;你的任务是执行下面操作后使数组 nums1 和 nums2 中 最大 可达数字 尽可能小。 将每个 0 替换为正偶数&#xff0c;将每个 1 替换为正奇数。在替换后&#xff0c;两个数组都应该 递…

三轴云台之积分分离PID控制算法篇

一、核心原理 积分分离PID控制的核心在于动态调整积分项的作用&#xff0c;以解决传统PID在三轴云台应用中的超调、振荡问题&#xff1a; 大误差阶段&#xff08;如云台启动或快速调整时&#xff09;&#xff1a; 关闭积分项&#xff0c;仅使用比例&#xff08;P&#xff09;…

uv - 一个现代化的项目+环境管理工具

参考&#xff1a; 【uv】Python迄今最好的项目管理环境管理工具&#xff08;吧&#xff1f;&#xff09;_哔哩哔哩_bilibili 项目需求 想象&#xff0c;每次创建一个项目的时候&#xff0c;我们需要去写 README. md, .git 仓库, .gitignore&#xff0c;你会感觉很头大 对于 …

经典密码学和现代密码学的结构及其主要区别(2)维吉尼亚密码—附py代码

Vigenre cipher 维吉尼亚密码 维吉尼亚密码由布莱斯德维吉尼亚在 16 世纪发明&#xff0c;是凯撒密码的一个更复杂的扩展。它是一种多字母替换密码&#xff0c;使用一个关键字来确定明文中不同字母的多个移位值。 与凯撒密码不同&#xff0c;凯撒密码对所有字母都有固定的偏移…

视频逐帧提取图片的工具

软件功能&#xff1a;可以将视频逐帧提取图片&#xff0c;可以设置每秒提取多少帧&#xff0c;选择提取图片质量测试环境&#xff1a;Windows 10软件设置&#xff1a;由于软件需要通过FFmpeg提取图片&#xff0c;运行软件前请先设置FFmpeg&#xff0c;具体步骤 1. 请将…

数据结构第1章编程基础 (竟成)

第 1 章 编程基础 1.1 前言 因为数据结构的代码大多采用 C 语言进行描述。而且&#xff0c;408 考试每年都有一道分值为 13 - 15 的编程题&#xff0c;要求使用 C/C 语言编写代码。所以&#xff0c;本书专门用一章来介绍 408 考试所需的 C/C 基础知识。有基础的考生可以快速浏览…

msql的乐观锁和幂等性问题解决方案

目录 1、介绍 2、乐观锁 2.1、核心思想 2.2、实现方式 1. 使用 version 字段&#xff08;推荐&#xff09; 2. 使用 timestamp 字段 2.3、如何处理冲突 2.4、乐观锁局限性 3、幂等性 3.1、什么是幂等性 3.2、乐观锁与幂等性的关系 1. 乐观锁如何辅助幂等性&#xf…