背景
由于数据库对应数据为一对多关系,查出实体list中关系id不同,但是关联表id、名字相等,需要把关联表id、名字相等的去重。
实现
第一种:在实体内部增加方法进行去重
代码:
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
private static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
Map<Object, Boolean> seen = new ConcurrentHashMap<>();
return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}
调用
facultyRetList = facultyList.stream().filter(distinctByKey(Faculty::getId)).collect(Collectors.toList());
由于实体是用mybatis-generator自动生成,一旦改变实体,再次生成将会恢复回初始状态,所以用这个方法不合适。
第二种:根据set中元素不允许重复的特性去重
代码:
List<User> users = list.stream().collect(
Collectors.collectingAndThen(Collectors.toCollection(
() -> new TreeSet<>(Comparator.comparing(User::getId))), ArrayList::new));
这种去重方式通过set中元素不重复的特性,重写Comparator方法以规定的成员变量为条件。这种方法不改变实体,正好符合需求。
参考
http://www.cnblogs.com/miaoying/p/9542002.html
https://blog.csdn.net/songkai558919/article/details/82529825