一般对集合对象去重,我们会借助Set来完成。Set集合会校验对象的
equals
方法和hashCode
方法来判断两个对象是否相同。
但是有一些场景下是判断对象某些属性(例如id)来进行去重。
原有方式
这种方式我们会一般会采用如下的方式:
每次都需要新建一个Set,然后借助set.add()
方法,校验下id是否在set中。
Set<User> ids=new HashSet<>();
List<User> distinctList = us.stream().filter(ids::add).collect(Collectors.toList());
System.out.println(JSON.toJSONString(distinctList));
lambda提供静态方法
实现:将Function函数转化为Predicate函数。
/**
* 根据id去重,
*/
private static <T, R> Predicate<T> distinctById(Function<T, R> function) {
Set<R> set = new HashSet<>();
return h -> set.add(function.apply(h));
}
使用方式:
List<User> collect = us.stream().filter(distinctById(User::getId)).collect(Collectors.toList());
网友评论