list集合中怎么根据某个字段去重,stream流
时间: 2025-07-04 22:06:23 浏览: 2
### 使用 Java Stream API 根据对象的特定字段对列表进行去重
当需要基于对象的一个或多个字段去除 `List` 集合中的重复项时,可以利用 Java Stream API 的强大功能实现这一目标。对于这种情况,通常会采用自定义逻辑来确保仅依据指定属性区分唯一性。
一种常见做法是在流操作链中引入中间操作 `filter()` 并配合使用辅助函数或 lambda 表达式完成过滤工作。下面展示了一个具体实例,其中展示了如何根据实体类 `Entity` 中名为 `tid` 的字段移除重复条目:
```java
import java.util.*;
import java.util.stream.Collectors;
public class DistinctExample {
public static void main(String[] args) {
List<Entity> list = Arrays.asList(
new Entity(1, "A"),
new Entity(2, "B"),
new Entity(1, "C"), // Duplicate tid with different name
new Entity(3, "D")
);
List<Entity> lists = list.stream()
.filter(DistinctExample::distinctByKey)
.collect(Collectors.toList());
System.out.println(lists);
}
private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
Set<Object> seen = ConcurrentHashMap.newKeySet();
return t -> seen.add(keyExtractor.apply(t));
}
}
class Entity {
int tid;
String name;
Entity(int tid, String name) {
this.tid = tid;
this.name = name;
}
@Override
public String toString() {
return "Entity{" +
"tid=" + tid +
", name='" + name + '\'' +
'}';
}
public int getTid() {return tid;}
}
```
上述代码片段实现了按给定键(这里是 `tid` 字段)筛选不重复记录的功能[^1]。此方法不仅限于基本数据类型作为键值,在面对复杂业务场景下同样适用。
另外值得注意的是,默认情况下调用 `stream().distinct()` 可以直接去除完全相同的对象副本,前提是这些对象正确覆盖了 `equals(Object obj)` 和 `hashCode()` 方法以便比较相等性和散列码一致性[^4]。如果希望按照单个成员变量决定唯一性,则需采取更灵活的方式如上所示。
阅读全文
相关推荐


















