背景
由於數據庫對應數據爲一對多關係,查出實體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