通过stream对list集合中对象的多个字段进行去重

记录下通过stream流对list集合中对象的多个字段进行去重!

举个栗子,对象book,我们要通过姓名和价格这两个字段的值进行去重,该这么做呢?

  •  distinct()返回由该流的不同元素组成的流。distinct()是Stream接口的方法。distinct()使用hashCode()和equals()方法来获取不同的元素。因此,我们的类必须实现hashCode()和equals()方法。

要在实体类Book中重写hashCode()和equals()方法,比如:

import lombok.Data;

@Data
public class Book {
    private String name;
    private String author;
    private int price;
    public Book(String name, String author, int price) {
        this.name = name;
        this.author = author;
        this.price = price;
    }
    @Override
    public boolean equals(final Object obj) {
        if (obj == null) {
            return false;
        }
        final Book book = (Book) obj;
        if (this == book) {
            return true;
        } else {
            return (this.name.equals(book.getName()) && this.price == book.price);
        }
    }
    @Override
    public int hashCode() {
        int hashno = 7;
        hashno = 13 * hashno + (name == null ? 0 : name.hashCode());
        return hashno;
    }

}

然后测试类如下:

/**
 * stream流通对象中几个属性的值来进行去重
 */


public class Test1 {
    public static void main(String[] args) {
        List<Book> list = new ArrayList<>();
        {
            list.add(new Book("水浒传","施耐庵", 200));
            list.add(new Book("水浒传", "施耐庵1", 200));
            list.add(new Book("三国演义", "罗贯中", 150));
            list.add(new Book("西游记", "吴承恩", 300));
            list.add(new Book("西游记", "吴承恩2", 300));
        }
        long l = list.stream().distinct().count();
        System.out.println("No. of distinct books:"+l);
        list.stream().distinct().forEach(b -> System.out.println(b.getName()+ "," + b.getPrice()));

        list = list.stream().distinct().collect(Collectors.toList());
    }

}

运行结果如下:

ba

同样,如果是通过三个或者更多的字段进行去重,则只需在Book类中的equals方法中添加该字段即可!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 8及以上版本,可以使用Stream流的distinct()方法对集合进行去重操作。如果要根据多个字段进行去重,可以使用Stream流的map()方法和collect()方法,结合lambda表达式进行处理。 以下是示例代码: ```java public class Person { private String name; private int age; private String gender; public Person(String name, int age, String gender) { this.name = name; this.age = age; this.gender = gender; } // 省略getter和setter方法 @Override public boolean equals(Object obj) { if (obj == null || getClass() != obj.getClass()) { return false; } Person person = (Person) obj; return age == person.age && Objects.equals(name, person.name) && Objects.equals(gender, person.gender); } @Override public int hashCode() { return Objects.hash(name, age, gender); } } List<Person> personList = new ArrayList<>(); personList.add(new Person("Tom", 20, "male")); personList.add(new Person("Jerry", 22, "male")); personList.add(new Person("Lily", 20, "female")); personList.add(new Person("Tom", 20, "male")); personList.add(new Person("Lily", 20, "female")); List<Person> uniquePersonList = personList.stream() .map(person -> new Person(person.getName(), person.getAge(), person.getGender())) .distinct() .collect(Collectors.toList()); System.out.println(uniquePersonList); ``` 在上面的示例代码,我们定义了一个Person类,并创建了一个包含多个Person对象的列表personList。我们在Person类实现了`equals()`和`hashCode()`方法,用于指定去重的关键字,即按照name、age、gender属性进行去重。 我们使用Stream流的map()方法将Person对象转换为新的Person对象,这样可以避免在去重时修改原有的对象。然后使用distinct()方法进行去重操作,并将结果存储在uniquePersonList。 最后输出去重后的Person对象列表。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值