Java 使用 Stream 去重

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

在项目中可以会获取到一个集合,集合中有很多重复的数据,但是总感觉转成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)

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

根据集合对象中的 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)
  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用 Java 8 中的 Stream API 来对一个集合进行去重操作,具体实现如下: ```java List<String> list = Arrays.asList("apple", "orange", "banana", "apple", "orange"); List<String> distinctList = list.stream().distinct().collect(Collectors.toList()); System.out.println(distinctList); ``` 上述代码中,首先定义了一个包含多个重复元素的字符串集合 `list`,然后使用 `stream()` 方法将其转换为一个 Stream 对象,接着使用 `distinct()` 方法对 Stream 中的元素进行去重操作,最后使用 `collect()` 方法将去重后的元素重新收集到一个 List 集合中,得到的 `distinctList` 就是去重后的结果。 值得注意的是,上述代码中的 `distinct()` 方法使用了默认的元素比较器来进行去重操作。如果您需要根据自定义的比较规则来进行去重操作,可以使用 `distinct()` 方法的重载版本,该版本接受一个自定义的 `equals()` 方法实现作为参数,例如: ```java List<Person> personList = Arrays.asList( new Person("Tom", 20), new Person("Jerry", 30), new Person("Tom", 20), new Person("Alice", 25) ); List<Person> distinctPersonList = personList.stream().distinct() .collect(Collectors.toList()); ``` 上述代码中,首先定义了一个包含多个重复元素的自定义类型 `Person` 的集合 `personList`,其中每个 `Person` 对象包含姓名和年龄两个属性。接着使用 `stream()` 方法将其转换为一个 Stream 对象,然后使用 `distinct()` 方法对 Stream 中的元素进行去重操作,由于 `Person` 类没有实现 `equals()` 方法,因此默认使用了 `Object` 类的 `equals()` 方法来进行对象比较,最终得到的 `distinctPersonList` 集合中只包含了不重复的 `Person` 对象。如果需要自定义 `equals()` 方法来进行去重操作,可以在 `Person` 类中实现该方法,例如: ```java class Person { private String name; private int age; // 构造方法和getter/setter方法省略 @Override public boolean equals(Object obj) { if (obj == null || !(obj instanceof Person)) { return false; } Person other = (Person) obj; return this.name.equals(other.name) && this.age == other.age; } } ``` 上述代码中,重写了 `Person` 类的 `equals()` 方法,当两个 `Person` 对象的姓名和年龄都相同时,认为它们是相等的。这样,在使用 `distinct()` 方法进行去重操作时,就会按照自定义的比较规则来进行对象比较。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值