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