JAVA 自定義對象集合 List 根據自定義字段去重


1、擁有自定義對象 MyUser

1    @Data
2    public class MyUser {
3         private String userName;
4         private String passWord;
5     }

2、編寫自定義去重方法實現

/**
     * 根據list中對象某些字段去重
     * @param list 需要去重的list
     * @return 返回去重后的list
     */
    private static List<MyUser> removeDuplicateOutputField(List<MyUser> list) {
        Set<MyUser> set = new TreeSet<>(new Comparator<MyUser>() {
            @Override
            public int compare(MyUser myUser, MyUser myUserNew) {
                int compareToResult = 1;//==0表示重復
                if(StringUtils.equals(myUser.getUserName(), myUserNew.getUserName()) &&
                        StringUtils.equals(myUser.getPassWord(), myUserNew.getPassWord())) {
                    compareToResult = 0;
                }
                return compareToResult;
            }
        });
        set.addAll(list);
        return new ArrayList<>(set);
    }

注意:其中StringUtils.equals()   傳入兩個比較對象對應的字段,

比如想要加入userName 字段去重  就要加入  如下條件即可,  想要添加幾個字段自行添加即可

StringUtils.equals(myUser.getUserName(), myUserNew.getUserName())  也可以  使用
myUser.getAge().equals(myUserNew.getAge())  自行測試決定

3、測試結果

    @Test
    public void distinctMyUser(){
        List<MyUser> list1 = new ArrayList<>();
        MyUser user1 = new MyUser();
        user1.setUserName("zhangsan");
        user1.setPassWord("1234567");
        list1.add(user1);

        MyUser user2 = new MyUser();
        user2.setUserName("zhangsan");
        user2.setPassWord("123456");
        list1.add(user2);

        MyUser user3 = new MyUser();
        user3.setUserName("lisi");
        user3.setPassWord("123456");
        list1.add(user3);

        MyUser user4 = new MyUser();
        user4.setUserName("lisi");
        user4.setPassWord("123456");
        list1.add(user4);

        for (MyUser b: list1) {
            System.out.println("去重前:"+b.toString());
        }

        //去重
        list1 = removeDuplicateOutputField(list1);

        for (MyUser b: list1) {
            System.out.println("去重后:"+b.toString());
        }
    }

運行結果如下,達到預期,根據自己想要的字段進行list集合去重操作。

 

 二、List<T> 自定義對象,根據某一列去重,利用lambad 來實現

     @Test
    public void distinctList() {
        AdviceInfo adviceInfo = new AdviceInfo();
        adviceInfo.setHospId(8888L);
        adviceInfo.setSex("女");
        adviceInfo.setAge(22);

        AdviceInfo adviceInfo2 = new AdviceInfo();
        adviceInfo2.setHospId(8888L);
        adviceInfo2.setSex("男");
        adviceInfo2.setAge(22);

        ArrayList<AdviceInfo> adviceInfos = Lists.newArrayList();
        adviceInfos.add(adviceInfo);
        adviceInfos.add(adviceInfo2);

        adviceInfos.stream().filter(distinctByKey(e -> e.getHospId()))
                .collect(Collectors.toList())
                .forEach(adviceInfo1 -> System.out.println(adviceInfo1.getSex()));

    }

    public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
        Map<Object, Boolean> map = new ConcurrentHashMap<>();
        return t -> map.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
    }

運行結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM