आप लैम्बडा input -> getValueProvider().apply(input).getValue()
को अर्थशास्त्र को बदलने के बिना विधि संदर्भ के साथ प्रतिस्थापित नहीं कर सकते हैं।
एक विधि संदर्भ एकल विधि आमंत्रण को प्रतिस्थापित करता है, इसलिए यह एक लैम्ब्डा अभिव्यक्ति को प्रतिस्थापित नहीं कर सकता है जिसमें एक से अधिक विधि आमंत्रण शामिल हैं।
रूप input -> getValueProvider().apply(input)
का एक लैम्ब्डा अभिव्यक्ति getValueProvider()::apply
अगर द्वारा प्रतिस्थापित किया जा सकता है और वह भी तब, getValueProvider()
के मूल्यांकन समय लैम्ब्डा में के रूप में कोई फर्क नहीं पड़ता फार्म विधि प्रत्येक लैम्ब्डा शरीर मूल्यांकन पर शुरू हो जाती है, जबकि विधि के लिए इसे संदर्भ केवल एक बार आह्वान किया जाता है और नतीजा पकड़ा जाता है।
यह x -> System.out.println(x)
और System.out::println
के बीच के अंतर के समान है जहां फ़ील्ड की सामग्री System.out
अलग-अलग होती है लेकिन आम तौर पर इससे कोई फर्क नहीं पड़ता। लेकिन आपको अंतर के बारे में पता होना चाहिए।
आपके उदाहरण में, एक तीसरी विधि getValue()
आवेदित है। विधि संदर्भों के साथ व्यक्त करने का एकमात्र तरीका एक कार्यात्मक इंटरफ़ेस की आवश्यकता है जैसे Function
जिसमें andThen
और/या compose
जैसी विधियां हैं। हालांकि, जिस तरह से जावा 8 काम करता है, उसे संयोजन विधि का आह्वान करने के लिए लक्ष्य इंटरफ़ेस के पहले विधि संदर्भ को कास्टिंग करने की आवश्यकता होगी जो आपके पास अब लैम्ब्डा अभिव्यक्ति को पढ़ने के लिए आसान नहीं होगा: ((Function<X,Y>)getValueProvider()::apply).andThen(Y::getValue)
जहां Y
प्रकार है, apply(input)
रिटर्न।
ध्यान दें कि नियम कहता है "विधि संदर्भों के साथ लैम्बडा को बदलें जब संभव हो" जो आपको कहने के लिए कमरा देता है, "ठीक है, यहां असंभव है", हालांकि, मुझे यकीन नहीं है कि आप इसे कितना कॉल कर सकते हैं "नियम" तो ...
यदि आप अधिक कोड पोस्ट करेंगे तो यह आसान होगा ... –