Java对象集合Stream按照指定字段去重

在Java中,处理对象集合的时候,我们常常需要按照某个字段对数据进行去重。使用Java 8引入的Stream API,我们能够以简洁的方式实现这一功能。本文将详细讲解如何利用Stream去重对象集合中的重复元素。

流程概述

我们将要遵循以下流程来实现对象集合的去重:

步骤描述
1创建一个对象集合
2使用Stream API流化集合
3使用distinct方法去重
4将结果收集到新的集合中
5输出结果
流程图

以下是整个流程的可视化表示,以便更直观理解:

创建对象集合 流化集合 去重 收集结果 输出结果

具体实现步骤

1. 创建一个对象集合

我们首先定义一个简单的对象,例如Person类,并创建一个List集合来存储这些对象。

import java.util.ArrayList;
import java.util.List;

class Person {
    private String name;
    
    // 构造函数
    public Person(String name) {
        this.name = name;
    }
    
    // getter方法
    public String getName() {
        return name;
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
2. 使用Stream API流化集合

我们将创建一个List<Person>并填入一些对象。

List<Person> persons = new ArrayList<>();
persons.add(new Person("Alice"));
persons.add(new Person("Bob"));
persons.add(new Person("Alice")); // 重复的对象
  • 1.
  • 2.
  • 3.
  • 4.
3. 使用distinct方法去重

在使用流化后的集合中,我们会使用distinct()方法进行去重。为了按照指定字段去重,我们需要使用其他的方式,distinct()不支持基于字段的去重。因此我们可以使用Collectors.toMap()

import java.util.Map;
import java.util.stream.Collectors;

// 使用Stream进行去重
Map<String, Person> uniquePersons = persons.stream()
    .collect(Collectors.toMap(
        Person::getName, // 按照名字去重
        person -> person, // 保留Person对象
        (existing, replacement) -> existing // 如果名字重复,保留已有对象
    ));
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
4. 将结果收集到新的集合中

接下来,我们将从Map中提取去重后的结果:

List<Person> distinctPersons = new ArrayList<>(uniquePersons.values());
  • 1.
5. 输出结果

最后,我们可以输出去重后的结果。

distinctPersons.forEach(person -> System.out.println(person.getName()));
  • 1.
完整代码示例

以下是上述代码步骤的完整实现:

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

class Person {
    private String name;
    
    public Person(String name) {
        this.name = name;
    }
    
    public String getName() {
        return name;
    }
}

public class UniquePersonsExample {
    public static void main(String[] args) {
        List<Person> persons = new ArrayList<>();
        persons.add(new Person("Alice"));
        persons.add(new Person("Bob"));
        persons.add(new Person("Alice")); // 重复的对象
        
        // 使用Stream进行去重
        Map<String, Person> uniquePersons = persons.stream()
            .collect(Collectors.toMap(
                Person::getName, // 按照名字去重
                person -> person, // 保留Person对象
                (existing, replacement) -> existing // 如果名字重复,保留已有对象
            ));
        
        List<Person> distinctPersons = new ArrayList<>(uniquePersons.values());
        
        // 输出结果
        distinctPersons.forEach(person -> System.out.println(person.getName()));
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.

旅行图

以下是实现过程中我的心路历程,对学习过程中的感受和反馈进行可视化:

学习Java对象集合去重的旅程 3 4 5
理解需求
理解需求
5
我需要去重对象集合中的元素
我需要去重对象集合中的元素
研究资料
研究资料
3
查找Java Stream的文档和示例
查找Java Stream的文档和示例
实践编码
实践编码
4
编写代码实现去重
编写代码实现去重
调试与测试
调试与测试
4
运行测试确定代码有效性
运行测试确定代码有效性
总结收获
总结收获
5
理解了Java中Stream API的用法
理解了Java中Stream API的用法
学习Java对象集合去重的旅程

总结

通过以上步骤,我们成功使用Java的Stream API实现了对象集合的去重。掌握这个技巧后,处理集合数据时将高效许多。希望本文能帮助你更深入地理解Java Stream的使用!