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

533 阅读5分钟

image

前言

  在 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 文件中添加以下依赖:

<!-- 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,再由子模块决定用到哪些模块,你可以在父模块中加入:

<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>

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

<dependencies>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-core</artifactId>
    </dependency>
</dependencies>

二、核心功能详解

2.1 准备工作

@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)
@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)
@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
@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,并自定义合并规则。
对于同一键的不同值,支持自定义处理逻辑。
@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困扰,能够愉快地编写出高效、功能完善的程序。

image