使用 Java Stream 根据某个字段分组并去重的实现

在 Java 中,Stream API 是一个强大的工具,可以用来处理集合数据。经常我们需要根据某个字段对集合中的元素进行分组并去重。今天,我们就一起来学习如何实现这一功能。以下是我们将要遵循的步骤。

流程表

步骤 描述
1 准备一个集合(比如 List)
2 将集合转换为 Stream
3 使用 collectCollectors.groupingBy 进行分组
4 处理分组后的结果,进行去重

详细步骤及代码实现

第一步:准备一个集合(比如 List)

首先,我们需要一个包含对象的集合。例如,我们有一个 Person 类,包含 nameage 两个属性。我们可以创建一个包含多个人员信息的 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();

第三步:使用 collectCollectors.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));

第四步:处理分组后的结果,进行去重

现在,我们将处理分组后的结果,去掉年龄重复的人员信息。我们可以通过 mapdistinct 方法进行去重。

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 的强大之处,愿你在编程的道路上越走越远!