List集合根據指定字段去除重複值

主要通過反射獲取指定對象屬性,然後利用set集合,對指定屬性的值進行比較,結果相等則代表重複,代碼如下:

package cn.sinobest.sdg.util;

import java.lang.reflect.Field;
import java.util.*;

/**
 * @description 集合工具類
 * @author: dengweiping
 * @time: 2020/6/1 14:49
 */
public class ListUtil {
       /**
     * 根據指定對象屬性去除重複對象
     *
     * @param list         傳入的list集合
     * @param propertyName 指定的去重屬性名稱
     */
    public static <T> List<T> removeRepeat(List<T> list, String propertyName) {
        if (list == null || list.isEmpty()) {
            return null;
        }
        //根據屬性值進行去重
        Set<T> sets = new TreeSet<>((o1, o2) -> {
            try {
                Field field1 = o1.getClass().getDeclaredField(propertyName);
                Field field2 = o2.getClass().getDeclaredField(propertyName);
                field1.setAccessible(true);
                field2.setAccessible(true);
                Object obj1 = field1.get(o1);
                Object obj2 = field2.get(o2);
                //根據指定屬性進行去重
                return obj1.toString().compareTo(obj2.toString());
            } catch (NoSuchFieldException | IllegalAccessException e) {
                e.printStackTrace();
            }
            return 0;
        });
        sets.addAll(list);
        return new ArrayList(sets);
    }

    /**
     * 根據指定key去除重複Map
     *
     * @param list    傳入的list集合
     * @param keyName 指定的key
     */
    public static List<Map<String, Object>> removeMapRepeat(List<Map<String, Object>> list, String keyName) {
        if (list == null || list.isEmpty()) {
            return null;
        }
        //根據屬性值進行去重
        Set<Map<String, Object>> sets = new TreeSet<>((m1, m2) -> {
            Object obj1 = m1.get(keyName);
            Object obj2 = m2.get(keyName);
            //根據指定的key進行去重
            return obj1.toString().compareTo(obj2.toString());
        });
        sets.addAll(list);
        return new ArrayList(sets);
    }

}

更多工具類可以查看我的博客:Java字符串、集合等工具類合集
項目源碼地址:全球同性交友網站

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