记录下通过stream流对list集合中对象的多个字段进行去重!
举个栗子,对象book,我们要通过姓名和价格这两个字段的值进行去重,该这么做呢?
要在实体类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方法中添加该字段即可!