एक विधि संदर्भ की रचना करने का एक तरीका है जो एक वर्तमान विधि संदर्भ के विपरीत है। नीचे @ vlasec का उत्तर देखें जो दिखाता है कि कैसे विधि संदर्भ को स्पष्ट रूप से कास्टिंग करके Predicateऔर फिर negateफ़ंक्शन का उपयोग करके इसे परिवर्तित करना । यही कारण है कि कुछ अन्य तरीकों में से एक तरीका यह करने के लिए बहुत परेशानी भरा नहीं है।
इस के विपरीत:
Stream<String> s = ...;
int emptyStrings = s.filter(String::isEmpty).count();
क्या यह:
Stream<String> s = ...;
int notEmptyStrings = s.filter(((Predicate<String>) String::isEmpty).negate()).count()
या यह:
Stream<String> s = ...;
int notEmptyStrings = s.filter( it -> !it.isEmpty() ).count();
व्यक्तिगत रूप से, मैं बाद की तकनीक को पसंद करता हूं क्योंकि मुझे it -> !it.isEmpty()एक लंबी क्रिया स्पष्ट कलाकारों की तुलना में पढ़ने के लिए स्पष्ट लगता है और फिर नकारात्मक।
एक भी एक विधेय बना सकता है और उसका पुन: उपयोग कर सकता है:
Predicate<String> notEmpty = (String it) -> !it.isEmpty();
Stream<String> s = ...;
int notEmptyStrings = s.filter(notEmpty).count();
या, यदि कोई संग्रह या सरणी है, तो बस एक लूप का उपयोग करें जो सरल है, कम ओवरहेड है, और * तेजी से ** हो सकता है:
int notEmpty = 0;
for(String s : list) if(!s.isEmpty()) notEmpty++;
* यदि आप जानना चाहते हैं कि क्या तेज है, तो JMH http://openjdk.java.net/projects/code-tools/jmh का उपयोग करें , और जब तक यह सभी JVM ऑप्टिमाइज़ेशन से बच नहीं जाता है तब तक हाथ बेंचमार्क कोड से बचें। जावा 8: स्ट्रीम का प्रदर्शन बनाम संग्रह
** मुझे यह सुझाव देने के लिए फ्लैक मिल रहा है कि लूप तकनीक तेज है। यह एक धारा निर्माण को समाप्त करता है, यह एक अन्य विधि कॉल (विधेय के लिए नकारात्मक कार्य) का उपयोग करके समाप्त करता है, और यह एक अस्थायी संचायक सूची / काउंटर को समाप्त करता है। तो कुछ चीजें जो अंतिम निर्माण द्वारा बचाई जाती हैं जो इसे तेज कर सकती हैं।
मुझे लगता है कि यह सरल और अच्छा है, भले ही यह तेज न हो। यदि नौकरी एक हथौड़ा और एक कील के लिए बुलाती है, तो एक जंजीर और गोंद में मत लाओ! मुझे पता है कि आप में से कुछ इसके साथ समस्या लेते हैं।
विश-लिस्ट: मैं देखना चाहूंगा कि जावा Streamफ़ंक्शंस अब थोड़ा विकसित हो रहे हैं कि जावा उपयोगकर्ता उनसे अधिक परिचित हैं। उदाहरण के लिए, स्ट्रीम में 'गणना' विधि को स्वीकार Predicateकर सकता है ताकि यह सीधे इस तरह किया जा सके:
Stream<String> s = ...;
int notEmptyStrings = s.count(it -> !it.isEmpty());
or
List<String> list = ...;
int notEmptyStrings = lists.count(it -> !it.isEmpty());
Predicate.not(Predicate)विधि के अतिरिक्त को शामिल करता है । लेकिन यह मुद्दा अभी भी खुला है इसलिए हम इसे जावा 12 (यदि कभी हो) में जल्द से जल्द देखेंगे।