2014-09-01 9 views
8

इस कोड नमूनासोनार: एक विधि संदर्भ

Collection<Number> values = transform(
     getValuatedObjects(), 
     input -> getValueProvider().apply(input).getValue()); 

के साथ इस लैम्ब्डा बदलें उल्लंघन करता sonarqube rule:

जब संभव विधि संदर्भ के साथ lambdas बदलें

यह एक सोनार बग है ? या क्या मैं वास्तव में एक विधि संदर्भ का उपयोग कर सकता हूं?

+0

यदि आप अधिक कोड पोस्ट करेंगे तो यह आसान होगा ... –

उत्तर

16

आप लैम्बडा 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) रिटर्न।

ध्यान दें कि नियम कहता है "विधि संदर्भों के साथ लैम्बडा को बदलें जब संभव हो" जो आपको कहने के लिए कमरा देता है, "ठीक है, यहां असंभव है", हालांकि, मुझे यकीन नहीं है कि आप इसे कितना कॉल कर सकते हैं "नियम" तो ...

+0

इस उत्तर के लिए धन्यवाद। तो हम कह सकते हैं कि यह एक सोनार बग है। – gontard

+2

हाय, मैं पुष्टि करता हूं कि यह वास्तव में एक झूठी सकारात्मक है। इस समस्या को ठीक करने के लिए टिकट बनाया गया है: https://jira.codehaus.org/browse/SONARJAVA-640 – benzonico

+0

इस मुद्दे के पुराने लिंक को अपडेट करना: https://jira.sonarsource.com/browse/SONARJAVA-640 – benzonico

संबंधित मुद्दे