通过stream去重_java之stream对象去重

Stream提供的distinct()方法只能去除重复的对象,却无法根据指定的对象属性进行去重。在java8之前,大多数都是使用for+if来去重对象的属性.有了stream之后就不需要写那么复杂有难懂的代码了,

第一种方式如下,

List unique =users.stream().collect(

collectingAndThen(toCollection(()-> new TreeSet<>(Comparator.comparing(o ->o.getId()))),

ArrayList::new));

上述代码是根据User对象属性的id来去重,这种方法唯一的坏处就是执行了流的终端操作,流就不能继续使用了。

第二种方式如下

user=users.stream()

.filter(distinctByKey(o->o.getId()))

.collect(Collectors.toList());

如上,distinctByKey是自定义方法,如下

public static Predicate distinctByKey(Function super T, Object>keyExtractor) {

Map seen = new ConcurrentHashMap<>();return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;

}

首先是filter方法,返回一个流,需要一个Predicate类型的参数(多嘴介绍下Predicate这个函数式接口,接受一个参数,返

你可能感兴趣的:(通过stream去重)