List Stream 对象调用distinct()方法,distinct()不提供按照属性对对象列表进行去重的直接实现。它是基于hashCode()和equals()工作的;
判断两个对象是否相同原理与HashMap定位key原理相同,先计算hashCode,如果hashCode相同继续调用equals()方法。
1. Stream.distinct()
distinct()方法的声明如下:
Stream<T>
distinct()
2.示例:
package com.concretepage; public class Book { private String name; private int price; public Book(String name, int price) { this.name = name; this.price = price; } public String getName() { return name; } public int getPrice() { return 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.name) && this.price == book.price); } } @Override public int hashCode() { int hashno = 7; hashno = 13 * hashno + (name == null ? 0 : name.hashCode()); return hashno; } }
public class Animal { private String name; private Integer age; public Animal(String name, Integer age) { this.name = name; this.age = age; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Animal animal = (Animal) o; return Objects.equals(name, animal.name) && Objects.equals(age, animal.age); } @Override public int hashCode() { return Objects.hash(name, age); } @Override public String toString() { return "Animal{" + "name='" + name + '\'' + ", age=" + age + '}'; } }