मुझे अक्सर Stream
फ़िल्टर करने की आवश्यकता होती है या एक अनुमानित उपयोग का उपयोग करने के लिए जो जांचता है कि किसी दिए गए फ़ील्ड का मान दिया गया है या नहीं।क्या कोई भविष्यवाणी करने के लिए कोई सुविधा तरीका है जो परीक्षण करता है यदि कोई फ़ील्ड किसी दिए गए मान के बराबर है?
कहते हैं, उदाहरण के लिए मैं इस POJO है:
public class A {
private Integer field;
public A(final Integer field) {
this.field = field;
}
public Integer getField() {
return field;
}
}
और मैं field
के मूल्य के आधार फिल्टर करने के लिए वस्तुओं की एक Stream
हैं:
final Integer someValue = 42;
Stream.of(new A(42), new A(1729), new A(42), new A(87539319), new A(null))
.filter(a -> Objects.equals(a.getField(), someValue))
...
की सुविधा विधि वहाँ होगा filter
विधि के लिए पूर्वानुमान उत्पन्न करें? मैंने देखा कि Predicate.isEqual
है लेकिन यह आवश्यकता के अनुरूप नहीं है।
मैं काफी आसानी से इस तरह एक लिख सकते हैं:
public static <T,R> Predicate<T> isEqual(Function<? super T, ? extends R> f, R value) {
return v -> Objects.equals(value, f.apply(v));
}
और के रूप में उपयोग:
Stream.of(new A(42), new A(1729), new A(42), new A(87539319), new A(null))
.filter(isEqual(A::getField, someValue))
...
लेकिन मैं JDK से एक मौजूदा विधि पुन: उपयोग करने यदि संभव हो तो पसंद करेंगे।
मुझे नहीं पता कि मुझे पता है। लेकिन ध्यान दें कि यदि आप जानते हैं कि 'कुछ वैल्यू' शून्य नहीं है, तो एक सरल 'a -> someValue.equals (a.getField()) 'पर्याप्त है। यह 'isEqual (ए :: GetField, someValue) 'से भी बदतर नहीं दिखता है, खासकर यदि मैं मानता हूं कि' ए 'बल्कि' NameOfARealLifeClass' 'है ... – Holger