一般對(duì)集合對(duì)象去重,我們會(huì)借助Set來(lái)完成。Set集合會(huì)校驗(yàn)對(duì)象的
equals
方法和hashCode
方法來(lái)判斷兩個(gè)對(duì)象是否相同蛛淋。
但是有一些場(chǎng)景下是判斷對(duì)象某些屬性(例如id)來(lái)進(jìn)行去重褐荷。
原有方式
這種方式我們會(huì)一般會(huì)采用如下的方式:
每次都需要新建一個(gè)Set嘹悼,然后借助set.add()
方法,校驗(yàn)下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提供靜態(tài)方法
實(shí)現(xiàn):將Function函數(shù)轉(zhuǎn)化為Predicate函數(shù)限匣。
/**
* 根據(jù)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());