如果您想要实现 equals 和 hashCode 方法,那么需要在 Parent 类中进行。在该类内部添加方法,例如:
@Override
public int hashCode() {
return Objects.hash(getAttrib1(), getAttrib2(), getAttrib3(),
getAttrib19(), getAttrib20());
}
@Override
public boolean equals(Object obj) {
if(this==obj) return true;
if(!(obj instanceof Parent)) return false;
Parent p=(Parent) obj;
return Objects.equals(getAttrib1(), p.getAttrib1())
&& Objects.equals(getAttrib2(), p.getAttrib2())
&& Objects.equals(getAttrib3(), p.getAttrib3())
&& Objects.equals(getAttrib19(), p.getAttrib19())
&& Objects.equals(getAttrib20(), p.getAttrib20());
}
如果您这样做了,对于一个
Stream<Parent>
调用
distinct()
将自动执行正确的操作。
如果您不想(或无法)更改
Parent
类,那么就没有委托机制来实现相等性,但是您可以诉诸
排序 ,因为它具有委托机制。
Comparator<Parent> c=Comparator.comparing(Parent::getAttrib1)
.thenComparing(Parent::getAttrib2)
.thenComparing(Parent::getAttrib3)
// …
.thenComparing(Parent::getAttrib19)
.thenComparing(Parent::getAttrib20);
这定义了基于属性的顺序。它要求属性本身具有可比性。如果您有这样的定义,您可以使用它来实现基于该 Comparator
的 distinct()
相当于:
List<Parent> result = Stream.concat(list1.stream(), list2.stream())
.filter(new TreeSet<>(c)::add)
.collect(Collectors.toList());
还有一个线程安全的变体,以防您想要在并行流中使用它:
List<Parent> result = Stream.concat(list1.stream(), list2.stream())
.filter(new ConcurrentSkipListSet<>(c)::add)
.collect(Collectors.toList());