आप 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());
}
विधियों को जोड़ने, distinct()
एक Stream<Parent>
पर लागू स्वचालित रूप से सही काम करेंगे।
यदि आप नहीं करना चाहते हैं (या नहीं कर सकते हैं) वर्ग Parent
बदलने के लिए, वहाँ समानता के लिए कोई प्रतिनिधिमंडल तंत्र है, लेकिन आप आदेश देने के रूप में एक प्रतिनिधिमंडल तंत्र है का सहारा हो सकता है:
Comparator<Parent> c=Comparator.comparing(Parent::getAttrib1)
.thenComparing(Parent::getAttrib2)
.thenComparing(Parent::getAttrib3)
// …
.thenComparing(Parent::getAttrib19)
.thenComparing(Parent::getAttrib20);
यह गुणों के आधार पर एक आदेश परिभाषित करता है। यह आवश्यक है कि गुणों के प्रकार तुलनीय हैं। आप इस तरह के एक परिभाषा है, तो आप एक distinct()
के बराबर, के आधार पर लागू करने के लिए उपयोग कर सकते हैं कि Comparator
:
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());
डुप्लिकेट मानों से बचने के लिए सेट का उपयोग करें। – Noundla
देखें http://stackoverflow.com/questions/27870136/java-lambda-stream-distinct-on-arbitrary-key/27872086 –
कूल इको सुविधा जो आपको मिली है :) – CKing