Java8 根據對象成員變量去重

背景

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章