Hutool之CollStreamUtil:集合流操作的神器

前言

在 Java 开发中,集合操作是日常工作中不可或缺的一部分。随着 Java 8 的引入,Stream API 为集合操作带来了极大的便利性,使得代码更加简洁、高效。然而,在实际开发中,我们常常需要对集合进行复杂的转换、分组、合并等操作,这时传统的 Stream API 可能显得有些繁琐。为了进一步简化这些操作,Hutool 库提供了 CollStreamUtil 工具类,它封装了大量常用的集合操作功能,极大提升了开发效率。本文将从浅入深的角度,结合实例详细讲解 CollStreamUtil 工具类的使用方法,并展示其在实际开发中的应用场景。

一、概述

1.1 工具简介

CollStreamUtil 是 Hutool 库中针对 Java8 Stream 特性进行封装的工具类,主要用于简化集合操作的工具类,它封装了多种常用的功能,包括集合的转换、分组、提取、合并等操作。这些功能可以极大地减少代码量,提高开发效率。以下是 CollStreamUtil 的主要功能:

序号 功能分类 简要说明
1 集合转换 通过 toIdentityMap 方法将对象集合转换为键值对映射(Map)。
2 分组操作 通过 group2Map、groupBy、groupByKey、groupKeyValue等方法根据指定属性对集合进行分组。
3 合并操作 通过 merge 方法合并两个相同类型的键值对集合。
4 提取操作 通过 toList、toMap、toSet等方法提取集合中某个属性的值。

1.2 引入依赖

在使用 Hutool 工具之前,我们需要将 Hutool 添加到项目的依赖中。如果使用 Maven 构建项目,可以在 pom.xml 文件中添加以下依赖:

xml 复制代码
<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>${hutool.version}</version>
</dependency>

Hutool-all 是一个 Hutool 的集成打包产品,由于考虑到"懒人"用户及分不清各个模块作用的用户,"无脑"引入 hutool-all 模块是快速开始和深入应用的最佳方式。如果你想像 Spring Boot 一样引入 Hutool,再由子模块决定用到哪些模块,你可以在父模块中加入:

xml 复制代码
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-bom</artifactId>
            <version>${hutool.version}</version>
            <type>pom</type>
            <!-- 注意这里是import -->
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

然后再在子模块中就可以引入自己需要的模块了:

xml 复制代码
<dependencies>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-core</artifactId>
    </dependency>
</dependencies>

二、核心功能详解

2.1 准备工作

java 复制代码
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
    // 班级id
    private long classId;
    // 班级id
    private long studentId;
    // 学生名称
    private String name;
}

2.2 集合转换

方法 简要说明
Map toIdentityMap(Collection collection, Function key) 将一个对象集合转换为Map,其中对象的某个属性作为键,对象本身作为值。
Map toIdentityMap(Collection collection, Function key, boolean isParallel)
Map toMap(Collection collection, Function key Function value) 将集合转换为键值对映射,适用于需要快速查找或操作集合中某个元素
Map toMap(Collection collection, Function key, Function value, boolean isParallel)
java 复制代码
@Test
public void toIdentityMapTest() {
    List<Student> list = new ArrayList<>();
    list.add(new Student(1, 1, "张三"));
    list.add(new Student(1, 2, "李四"));
    list.add(new Student(1, 3, "王五"));
    list.add(new Student(2, 1, "擎天柱"));
    list.add(new Student(2, 2, "威震天"));
    list.add(new Student(2, 2, "霸天虎"));

    // 将学生列表转换为 Map,键为学生 ID,值为学生对象
    Map<Long, Student> identityMap = CollStreamUtil.toIdentityMap(list, Student::getStudentId);
    System.out.println(identityMap);
}

@Test
public void toMapTest() {
    List<Student> list = new ArrayList<>();
    list.add(new Student(1, 1, "张三"));
    list.add(new Student(1, 2, "李四"));
    list.add(new Student(2, 3, "王五"));
    list.add(new Student(2, 1, "擎天柱"));
    list.add(new Student(2, 2, "威震天"));
    list.add(new Student(2, 2, "霸天虎"));
    // 将学生列表转换为 Map,自定义键为学生 ID,值为学生名称
    Map<Long, String> map = CollStreamUtil.toMap(list, Student::getStudentId, Student::getName);
    System.out.println(map);
}

2.3 提取操作

方法 简要说明
List toList(Collection collection, Function key) 将集合中的元素按照指定规则进行提取和转换,生成一个新的列表。
List toList(Collection collection, Function key)
Set toSet(Collection collection, Function key)
Set toSet(Collection collection, Function function, boolean isParallel)
java 复制代码
@Test
public void toListTest() {
    List<Student> list = new ArrayList<>();
    list.add(new Student(1, 1, "张三"));
    list.add(new Student(1, 2, "李四"));
    list.add(new Student(2, 3, "王五"));
    list.add(new Student(2, 1, "擎天柱"));
    list.add(new Student(2, 2, "威震天"));
    list.add(new Student(2, 2, "霸天虎"));
    // 提取所有学生信息的姓名
    List<String> nameList = CollStreamUtil.toList(list, Student::getName);
    System.out.println(nameList);
}

2.4 分组操作

方法 简要说明
group2Map
groupBy 对集合中的元素按照指定的条件进行分组,生成一个新的以分组键为键、分组结果为值的 Map。
groupBy2Key
groupByKey 将集合按指定规则分组,返回一个以分组键为键、分组结果为值的 Map。
groupKeyValue
java 复制代码
@Test
public void groupByKeyTest() {
    List<Student> list = new ArrayList<>();
    list.add(new Student(1, 1, "张三"));
    list.add(new Student(1, 2, "李四"));
    list.add(new Student(2, 3, "王五"));
    list.add(new Student(2, 1, "擎天柱"));
    list.add(new Student(2, 2, "威震天"));
    list.add(new Student(2, 2, "霸天虎"));
    // 按班级分组
    Map<Long, List<Student>> map = CollStreamUtil.groupByKey(list, Student::getClassId);
    System.out.println(map);
}

2.5 合并操作

方法 简要说明
merge(Map map1, Map map2, BiFunction merge) 合并两个具有相同键类型的 Map,并自定义合并规则。 对于同一键的不同值,支持自定义处理逻辑。
java 复制代码
@Test
public void mergeTest() {
    Map<Integer, Student> map1 = new HashMap<>();
    map1.put(1, new Student(1, 1, "张三"));
    Map<Integer, Student> map2 = new HashMap<>();
    map2.put(2, new Student(1, 2, "李四"));


    // 合并两个Map
    Map<Integer, String> mergedMap = CollStreamUtil.merge(map1, map2, (student1, student2) -> {
        // 定义merge规则:
        if (student1 == null && student2 == null) {
            return null;
        } else if (student1 == null) {
            return student2.getName();
        } else if (student2 == null) {
            return student1.getName();
        } else {
            return StrUtil.join(",", student1.getName(), student2.getName());
        }
    });
    System.out.println(mergedMap);
}

三、总结

CollStreamUtil 工具类通过封装常见的集合操作功能,极大地简化了开发者的代码编写工作。无论是简单的转换、分组、提取,还是复杂的合并操作,都可以通过几行代码轻松实现。这不仅提高了开发效率,也使得代码更加简洁易读。Hutool 不仅仅只有这一种工具类,还包含了其他许多工具类。在这里我作为一名 Hutool 的用户,我感谢 Hutool 的创作者和维护者们为我们带来如此强大便捷的工具库,希望 Hutool 功能越来越完善,为我们的开发工作带来更多的便利。同时也祝愿所有开发者没有BUG困扰,能够愉快地编写出高效、功能完善的程序。

相关推荐
武子康21 分钟前
Java-80 深入浅出 RPC Dubbo 动态服务降级:从雪崩防护到配置中心秒级生效
java·分布式·后端·spring·微服务·rpc·dubbo
舒一笑1 小时前
我的开源项目-PandaCoder迎来史诗级大更新啦
后端·程序员·intellij idea
@昵称不存在2 小时前
Flask input 和datalist结合
后端·python·flask
zhuyasen2 小时前
Go 分布式任务和定时任务太难?sasynq 让异步任务从未如此简单
后端·go
东林牧之3 小时前
Django+celery异步:拿来即用,可移植性高
后端·python·django
超浪的晨3 小时前
Java UDP 通信详解:从基础到实战,彻底掌握无连接网络编程
java·开发语言·后端·学习·个人开发
AntBlack4 小时前
从小不学好 ,影刀 + ddddocr 实现图片验证码认证自动化
后端·python·计算机视觉
Pomelo_刘金4 小时前
Clean Architecture 整洁架构:借一只闹钟讲明白「整洁架构」的来龙去脉
后端·架构·rust
双力臂4044 小时前
Spring Boot 单元测试进阶:JUnit5 + Mock测试与切片测试实战及覆盖率报告生成
java·spring boot·后端·单元测试
midsummer_woo6 小时前
基于spring boot的医院挂号就诊系统(源码+论文)
java·spring boot·后端