2015-09-09 11 views
8

जब कोई जावा विधि Function<? super T, ? extends U> स्वीकार करती है, तो निम्नलिखित वाक्यविन्यास में विधि संदर्भ प्रदान करना संभव है: MyClass::myMethodचेनिंग लैम्ब्डा फ़ंक्शन

हालांकि, मैं सोच रहा हूं कि एकाधिक विधि कॉल श्रृंखला का कोई तरीका है या नहीं। मामले को चित्रित करने के लिए यहां एक उदाहरण दिया गया है।

// on a specific object, without lambda 
myString.trim().toUpperCase() 

मुझे आश्चर्य है कि लैम्बडा अभिव्यक्ति में इसका अनुवाद करने के लिए कोई वाक्यविन्यास है या नहीं। मुझे उम्मीद है कि निम्नलिखित में कुछ ऐसा है:

// something like: (which doesn't work) 
String::trim::toUpperCase 

वैकल्पिक रूप से, क्या कार्य करने के लिए एक उपयोगिता वर्ग है?

// example: (which does not exist) 
FunctionUtil.chain(String::trim, String::toUpperCase); 
+0

कैसे ['function.andThen'] (https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html#andThen-java.util.function.Function -)? –

+2

कैनोनिकल समाधान विधि संदर्भों का उपयोग करके _stop करना है, और बस 'myString -> myString.trim()। ToUpperCase() 'लिखें। –

+0

@ लुइस वासरमैन एक उत्कृष्ट कामकाज। लेकिन मैं वास्तव में अधिक वाक्य रचनात्मक मिठास की उम्मीद कर रहा था। – bvdb

उत्तर

4

जावा 8 Function विधि andThen साथ श्रृंखलित जा सकता है:

UnaryOperator<String> trimFunction = String::trim; 
UnaryOperator<String> toUpperCaseFunction = String::toUpperCase; 
Stream.of(" a ", " b ").map(trimFunction.andThen(toUpperCaseFunction)) // Stream is now ["A", "B"] 

ध्यान रखें कि आपके वास्तविक उदाहरण में, String::trim संकलन नहीं है क्योंकि trim विधि किसी भी इनपुट नहीं ले करता है, तो यह होता है कार्यात्मक इंटरफ़ेस Function (String::toUpperCase के लिए जाता है) के अनुरूप नहीं है।

+2

एन तर्क के साथ एक उदाहरण विधि एन + 1 तर्क के साथ एक प्रकार का कार्य है; अतिरिक्त तर्क 'यह' है। इसलिए हम 'यूनरीऑपरेटर trimFunc = स्ट्रिंग :: ट्रिम ' – ZhongYu

+1

@ bayou.io कर सकते हैं मुझे नहीं पता था कि आप ऐसा कर सकते हैं। मैंने अपनी पोस्ट को आपके प्रस्ताव के साथ संपादित किया। – Tunaki

+2

यह 'फंक्शन <स्ट्रिंग, स्ट्रिंग>' के अनुरूप है ... – ZhongYu

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