stream根据某个字段去重
时间: 2023-08-12 11:43:59 浏览: 120
如何实现java8 list按照元素的某个字段去重
5星 · 资源好评率100%
你可以使用Java 8的Stream API中的distinct()方法根据某个字段去重。假设你有一个包含对象的流,每个对象都有一个属性叫做“name”,你可以按照以下方式去重:
```
List<Person> people = ... // 从某个地方获取Person对象列表
List<Person> uniquePeople = people.stream()
.filter(distinctByKey(Person::getName))
.collect(Collectors.toList());
// distinctByKey方法实现
public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
Map<Object, Boolean> seen = new ConcurrentHashMap<>();
return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}
```
在这个例子中,我们使用了一个名为distinctByKey的方法,它接受一个函数作为参数,用于提取要去重的字段,然后返回一个Predicate,用于过滤流中的重复元素。在distinctByKey方法中,我们使用了一个ConcurrentHashMap来存储已经出现过的键,并检查一个键是否已经存在。如果存在,我们就返回false,否则我们就将该键插入到Map中,并返回true。这样,我们就可以根据某个字段去重一个流了。
阅读全文