根据集合中指定的对象属性去重复
根据集合中User对象name
属性去重复,重复值保留第一次出现的,使用方式如下
public class Test {
public static void main(String[] args) {
// 模拟数据
List<User> list = Arrays.asList(new User("a", 2), new User("a", 3), new User("b", 3));
// 根据集合中指定的对象属性去重复
List<User> collect = list.stream().filter(CollUtils.distinctByKey(User::getName)).collect(Collectors.toList());
System.out.println(collect);
}
@Data
@AllArgsConstructor
static class User {
private String name;
private Integer age;
}
}
输出:
[App.User(name=a, age=2), App.User(name=b, age=3)]
实现代码如下
public class CollUtils {
/**
* 根据集合对象中指定的字段去重复
*
* @param keyExtractor keyExtractor
* @param <T> t
* @return Predicate
*/
public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
Set<Object> seen = ConcurrentHashMap.newKeySet();
return t -> seen.add(keyExtractor.apply(t));
}
}