list.stream.filter 根据某个字段去重
时间: 2023-08-12 09:23:55 浏览: 60
您好!要根据List中的某个字段进行去重和筛选,可以使用Java 8中的Stream API中的filter和distinct方法。
假设我们有一个List<User>,每个User对象包含id和name属性,现在要根据id属性进行去重和筛选,可以使用以下代码:
```
List<User> userList = ...; // 假设我们已经有了一个List<User>对象
List<User> distinctList = userList.stream()
.filter(distinctByKey(User::getId))
.collect(Collectors.toList());
```
上面的代码中,我们使用了Stream的filter()方法和自定义的distinctByKey()方法。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;
}
```
这个方法会根据传入的keyExtractor函数提取User对象的id属性,并使用ConcurrentHashMap来记录已经出现过的id值。如果当前id值是第一次出现,那么就返回true,否则返回false。这个方法会作为filter()方法的参数,用于筛选不重复的User对象。
需要注意的是,这种方法使用了ConcurrentHashMap来记录已经出现过的id值,因此可以在多线程环境下使用。如果您的应用程序是单线程的,可以使用普通的HashMap来代替ConcurrentHashMap。