学逆向论坛

找回密码
立即注册

只需一步,快速开始

发新帖

273

积分

0

好友

34

主题

[转载图文] Java 使用 Stream 去重

发表于 2024-10-14 14:54:13 | 查看: 136| 回复: 0
本帖最后由 jinchanchan 于 2024-10-14 14:59 编辑

作者:梧桐落叶不知深秋
链接: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<UserEntity> userList = Arrays.asList(a1, a2, a3, a4, a5, a6, a7);
        List<UserEntity> 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)</div></div>


根据对象多个属性进行去重
根据集合对象中的 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<UserEntity> userList = Arrays.asList(a1, a2, a3, a4, a5, a6, a7);

        List<UserEntity> 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<UserEntity> userList = Arrays.asList(a1, a2, a3, a4, a5, a6, a7);

        List<UserEntity> 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去重方法,分别是:

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

希望对大家有所帮助~

温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的认可,还可以获得学币奖励,请尊重他人的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
已有 1 人评分学币 理由
roger + 1 感谢您的作品,赞一个!

总评分: 学币 + 1   查看全部评分

小黑屋|手机版|站务邮箱|学逆向论坛 ( 粤ICP备2021023307号 )|网站地图

GMT+8, 2024-12-22 11:29 , Processed in 0.133337 second(s), 38 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表