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 + '}'; } }