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困扰,能够愉快地编写出高效、功能完善的程序。

相关推荐
用户4099322502123 分钟前
容器化部署FastAPI应用:如何让你的任务系统代码在云端跳舞?
后端·ai编程·trae
Java水解4 分钟前
MySQL 亿级数据表平滑分表实践:基于时间分片的架构演进
后端·mysql
Neo25511 分钟前
Spring 5.3.x 源码:invokeBeanFactoryPostProcessors()详解
后端
金銀銅鐵12 分钟前
[Java] 以 IntStream 为例,浅析 Stream 的实现
java·后端
Neo25516 分钟前
Spring 5.3.x 源码:refresh()方法
后端
码事漫谈23 分钟前
C++面试中的手写快速排序:从基础到最优的完整思考过程
后端
小兔兔吃萝卜2 小时前
Spring 创建 Bean 的 8 种主要方式
java·后端·spring
Java中文社群2 小时前
26届双非上岸记!快手之战~
java·后端·面试
whitepure2 小时前
万字详解Java中的面向对象(一)——设计原则
java·后端