stream根据某一字段去重java实体类
时间: 2025-01-15 10:26:24 浏览: 47
### 如何在Java中使用Stream API根据实体类的特定字段进行去重操作
为了基于实体类中的某个字段执行去重操作,可以利用 `distinct()` 方法结合自定义比较逻辑。然而,`distinct()` 默认依据对象的整体哈希码和相等性判断。对于按指定属性过滤重复项的需求,则需采用更灵活的方式——通常借助于 `Collectors.toMap` 或者先通过 `sorted().distinct()` 对定制键排序再去除相邻重复元素,但最常用的是创建一个临时辅助结构存储已见键。
下面展示了一种常见做法,即运用 `toSet()` 收集唯一记录的同时保持原有顺序:
```java
import java.util.*;
import java.util.stream.Collectors;
class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
// Getter and equals/hashCode based on 'name' field only.
@Override
public boolean equals(Object o) { /* ... */ }
@Override
public int hashCode() { /* ... */ }
public static void main(String[] args) {
List<Student> students = Arrays.asList(
new Student("Alice", 20),
new Student("Bob", 21),
new Student("Alice", 22), // Duplicate by name
new Student("Charlie", 23)
);
List<Student> distinctByName = students.stream()
.collect(Collectors.collectingAndThen(
Collectors.toMap(Student::getName, s -> s,
(existing, replacement) -> existing),
map -> new ArrayList<>(map.values())));
System.out.println(distinctByName);
}
}
```
上述代码片段展示了如何按照学生的名字(`name`)作为标准来进行去重[^2]。这里的关键在于构建了一个中间映射表,在遇到同名的学生时保留首次出现的那个实例;最后将此映射转换回列表形式输出结果。
另一种方法是直接调用 `stream().distinct()` 并覆盖实体类内的 `equals()` 和 `hashCode()` 方法使之仅考虑目标字段,但这可能影响到其他依赖这两个方法的地方,因此不推荐全局修改除非确实必要。
阅读全文
相关推荐


















