我可以: 邀请好友来看>>
ZOL星空(中国) > 软件星空(中国) > 开发者社区星空(中国) > java讨论星空(中国) > Java 使用 Stream 去重
帖子很冷清,卤煮很失落!求安慰
返回列表
签到
手机签到经验翻倍!
快来扫一扫!

Java 使用 Stream 去重

23浏览 / 1回复

vrn0hn

vrn0hn

0
精华
158
帖子

等  级:Lv.5
经  验:3832
  • Z金豆: 583

    千万礼品等你来兑哦~快点击这里兑换吧~

  • 城  市:
  • 注  册:2024-03-26
  • 登  录:2025-04-11
发表于 2024-10-14 15:17:34
电梯直达 确定
楼主

作者:梧桐落叶不知深秋
链接:https://blog.csdn.net/Agony921/article/details/131213616

根据对象单个属性进行去重

在项目中可以会获取到一个集合,集合中有很多重复的数据,但是总感觉转成Set去重不太体面,那就可以试试使用 Stream 来实现根据对象的属性进行去重

将集合转为Stream流后通过Collectors.toMap 进行去重

  • UserEntity::getName 指定根据名字去重

  • user -> user 执行后要转换的类型(因为我们不需要转换所以不处理)

  • (u1, u2) -> u1) 然后存在多个时我们保留第一个对象


(顺便吆喝一声,技术大厂内推,前后端测试捞人,感兴趣的看机会)

@Test
 public void propertyDistinct(){
        UserEntity a1 = new UserEntity().setId(1).setStatus(1).setName("A1");
        UserEntity a2 = new UserEntity().setId(2).setStatus(2).setName("A2");
        UserEntity a3 = new UserEntity().setId(3).setStatus(3).setName("A3");
        UserEntity a4 = new UserEntity().setId(4).setStatus(4).setName("A1");
        UserEntity a5 = new UserEntity().setId(5).setStatus(3).setName("A5");
        UserEntity a6 = new UserEntity().setId(6).setStatus(2).setName("A3");
        UserEntity a7 = new UserEntity().setId(7).setStatus(4).setName("A2");
        List userList = Arrays.asList(a1, a2, a3, a4, a5, a6, a7);
        List list = userList.stream()
                .collect(Collectors.toMap(UserEntity::getName, user -> user, (u1, u2) -> u1))
                .values()
                .stream()
                .collect(Collectors.toList());
        list.forEach(System.out::println);
 }

实现结果:
UserEntity(id=1, code=null, status=1, name=A1, sex=null, birthday=null, pingList=null)
UserEntity(id=2, code=null, status=2, name=A2, sex=null, birthday=null, pingList=null)
UserEntity(id=3, code=null, status=3, name=A3, sex=null, birthday=null, pingList=null)
UserEntity(id=5, code=null, status=3, name=A5, sex=null, birthday=null, pingList=null)


根据对象多个属性进行去重


根据集合对象中的 Id+“-”+Name 进行去重

   @Test    
   public void propertyDistinct(){
        UserEntity a1 = new UserEntity().setId(1).setStatus(1).setName("A1");
        UserEntity a2 = new UserEntity().setId(2).setStatus(2).setName("A2");
        UserEntity a3 = new UserEntity().setId(3).setStatus(3).setName("A3");
        UserEntity a4 = new UserEntity().setId(1).setStatus(4).setName("A1");
        UserEntity a5 = new UserEntity().setId(5).setStatus(3).setName("A5");
        UserEntity a6 = new UserEntity().setId(6).setStatus(2).setName("A3");
        UserEntity a7 = new UserEntity().setId(7).setStatus(4).setName("A2");
        List userList = Arrays.asList(a1, a2, a3, a4, a5, a6, a7);

        List uniqueList = userList.stream()
                .collect(Collectors.collectingAndThen(
                        Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getId() + "-" + o.getName()))),
                        ArrayList::new                ));
        uniqueList.forEach(System.out::println);
 }

实现结果:
UserEntity(id=1, code=null, status=1, name=A1, sex=null, birthday=null, pingList=null)
UserEntity(id=2, code=null, status=2, name=A2, sex=null, birthday=null, pingList=null)
UserEntity(id=3, code=null, status=3, name=A3, sex=null, birthday=null, pingList=null)
UserEntity(id=5, code=null, status=3, name=A5, sex=null, birthday=null, pingList=null)
UserEntity(id=6, code=null, status=2, name=A3, sex=null, birthday=null, pingList=null)
UserEntity(id=7, code=null, status=4, name=A2, sex=null, birthday=null, pingList=null)


根据对象所有属性进行去重


使用的 stream 的 distinct() 方法必须对象属性都相同

   @Test   
   public void propertyDistinct(){
        UserEntity a1 = new UserEntity().setId(1).setStatus(1).setName("A1");
        UserEntity a2 = new UserEntity().setId(2).setStatus(2).setName("A2");
        UserEntity a3 = new UserEntity().setId(3).setStatus(3).setName("A3");
        UserEntity a4 = new UserEntity().setId(1).setStatus(1).setName("A1");
        UserEntity a5 = new UserEntity().setId(5).setStatus(3).setName("A5");
        UserEntity a6 = new UserEntity().setId(3).setStatus(3).setName("A3");
        UserEntity a7 = new UserEntity().setId(7).setStatus(4).setName("A2");
        List userList = Arrays.asList(a1, a2, a3, a4, a5, a6, a7);

        List uniqueList = userList.stream().distinct().collect(Collectors.toList());
        uniqueList.forEach(System.out::println);
        
      }

实现结果:
UserEntity(id=1, code=null, status=1, name=A1, sex=null, birthday=null, pingList=null)
UserEntity(id=2, code=null, status=2, name=A2, sex=null, birthday=null, pingList=null)
UserEntity(id=3, code=null, status=3, name=A3, sex=null, birthday=null, pingList=null)
UserEntity(id=5, code=null, status=3, name=A5, sex=null, birthday=null, pingList=null)
UserEntity(id=7, code=null, status=4, name=A2, sex=null, birthday=null, pingList=null)



——————————————————————————————————————————————————
总结

本文给出了三种Java去重方法,分别是:

  • 根据对象单个属性进行去重

  • 根据对象多个属性进行去重

  • 根据对象所有属性进行去重


希望对大家有所帮助~


vrn0hn

vrn0hn


精华

帖子

等  级:Lv.5
经  验:3832
发表于 2024-10-15 17:00:22 1楼

很细致的一篇文章,分享出来跟大家共勉!

顺便捞人还个部门债(技术大厂,前 / 后端 or 测试岗,部门捞人!戳→https://jsj.top/f/o38ijj)

总之,如果缺个工作,不妨看看!



高级模式
星空(中国)精选大家都在看24小时热帖7天热帖大家都在问最新回答

针对ZOL星空(中国)您有任何使用问题和建议 您可以 联系星空(中国)管理员查看帮助  或  给我提意见

快捷回复 APP下载 返回列表