使用 Java Stream 根据某个字段分组并去重的实现
在 Java 中,Stream API 是一个强大的工具,可以用来处理集合数据。经常我们需要根据某个字段对集合中的元素进行分组并去重。今天,我们就一起来学习如何实现这一功能。以下是我们将要遵循的步骤。
流程表
步骤 | 描述 |
---|---|
1 | 准备一个集合(比如 List) |
2 | 将集合转换为 Stream |
3 | 使用 collect 和 Collectors.groupingBy 进行分组 |
4 | 处理分组后的结果,进行去重 |
详细步骤及代码实现
第一步:准备一个集合(比如 List)
首先,我们需要一个包含对象的集合。例如,我们有一个 Person
类,包含 name
和 age
两个属性。我们可以创建一个包含多个人员信息的 List。
import java.util.ArrayList;
import java.util.List;
// 定义 Person 类
class Person {
String name;
int age;
// 构造器
Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getter 方法
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
// 创建 Person 的集合
List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 25));
people.add(new Person("Bob", 30));
people.add(new Person("Alice", 28)); // 重复的名字
第二步:将集合转换为 Stream
接下来,我们将这个 List 转换为 Stream,以便可以使用 Stream API 进行操作。
import java.util.stream.Stream;
// 将 List 转换为 Stream
Stream<Person> personStream = people.stream();
第三步:使用 collect
和 Collectors.groupingBy
进行分组
接着,我们可以使用 Collectors.groupingBy
方法按 name
字段进行分组。
import java.util.Map;
import java.util.stream.Collectors;
// 按照 name 字段分组
Map<String, List<Person>> groupedByName = personStream.collect(Collectors.groupingBy(Person::getName));
第四步:处理分组后的结果,进行去重
现在,我们将处理分组后的结果,去掉年龄重复的人员信息。我们可以通过 map
和 distinct
方法进行去重。
import java.util.Set;
// 遍历分组后的结果,去重后收集
Map<String, Set<Integer>> uniqueAgesByName = groupedByName.entrySet().stream()
.collect(Collectors.toMap(
Map.Entry::getKey, // 获取分组名称
entry -> entry.getValue().stream() // 处理每一组
.map(Person::getAge) // 获取每个人的年龄
.collect(Collectors.toSet()) // 使用 Set 去重
));
最终结果
通过上面的代码,我们成功将原来的集合根据 name
字段进行了分组,并对每个组内的 age
字段进行了去重。最终的 uniqueAgesByName
变量将包含每个名字对应的唯一年龄集合。
System.out.println(uniqueAgesByName);
旅行图
journey
title 使用 Java Stream 分组与去重的旅程
section 准备集合
创建 Person 类: 5: 不确定
创建 List: 5: 不确定
section 流转换与分组
转换为 Stream: 5: 不确定
按 name 分组: 5: 不确定
section 去重处理
收集去重结果: 5: 不确定
结尾
通过使用 Java Stream API,我们可以有效地对集合进行分组和去重操作。以上流程简洁明了,适合初学者学习和实践。在实际开发中,你可以根据不同的业务需要,灵活运用 Stream API 来简化代码,提高代码的可读性和效率。希望这篇文章能够帮助你理解 Java Stream 的强大之处,愿你在编程的道路上越走越远!