2016-05-03 8 views
6

मिलाकर मेरे पास एक कार्यात्मक इंटरफ़ेस है जो सामान्य जेडीके फ़ंक्शन को सामान्य प्रकारों तक बढ़ाता है।जावा 8 फ़ंक्शन इंटरफ़ेस का विस्तार और उन्हें

public interface Transformer<T,R> extends Function<Message<T>, Message<R>> { 

    static <T, R> Transformer<T, R> combine2(Transformer<T, R> first, Transformer<T, R> second) { 
     return first.andThen(second)); 
    } 
} 

वहाँ कार्यों गठबंधन करने के लिए एक तरीका है कि मानक समारोह इंटरफ़ेस फैली या वहाँ बेहतर है है: अब मैं जो संकलक त्रुटि

Error:(25, 25) java: method andThen in interface java.util.function.Function<T,R> cannot be applied to given types;
required: java.util.function.Function<? super ui.instrumentation.api.messaging.Message<R>,? extends V> found: ui.instrumentation.api.transformation.Transformer<T,R> reason: cannot infer type-variable(s) V (argument mismatch; ui.instrumentation.api.transformation.Transformer<T,R> cannot be converted to java.util.function.Function<? super ui.instrumentation.api.messaging.Message<R>,? extends V>)

यहाँ फेंक है andthen का उपयोग कर दो कार्य संयोजित करना चाहते हैं नमूना कोड है ऐसा करने का तरीका?

+2

क्यों वास्तव में आप 'combine2' समारोह की जरूरत है, जब' andThen' अधिक सामान्य तर्क प्रकार 'Function' के लिए, सचमुच एक ही बात करता है? – Mshnik

+0

तो आप एक ऐसा फ़ंक्शन चाहते हैं जो 'संदेश ' लेता है, इसे 'पहले' पर भेजता है, 'संदेश ' वापस प्राप्त करता है, फिर किसी भी तरह से 'संदेश ' से 'दूसरे' को पास करता है, भले ही 'दूसरे' को 'संदेश' की आवश्यकता हो 'एक संदेश नहीं '। – immibis

+2

मेरी सिफारिश: इस तरह के विस्तारित इंटरफेस का उपयोग न करें। आप आधार इंटरफ़ेस (यहां 'फ़ंक्शन') के मौजूदा कार्यान्वयन का उपयोग करने की अनुमति न देने की कीमत पर टाइप करने के लिए कुछ अक्षरों को सहेजते हैं। इस प्रकार, आपको केवल 'और फिर', 'Function.identity()' जैसे छोटे कार्यों को 'ट्रांसफॉर्मर' के रूप में उपयोग नहीं किया जा सकता है, सबकुछ फिर से लागू करने की आवश्यकता है। दूसरी गलतियों से सबक सीखो; एक ही कार्यात्मक हस्ताक्षर होने के बावजूद, आप 'ट्रांसफार्मर ' का उपयोग नहीं कर सकते, जहां 'यूनरीऑपरेटर >' आवश्यक है (आधार प्रकार 'फंक्शन' की अनुमति न देने का एक और उदाहरण) ... – Holger

उत्तर

5

आप दोनों की जरूरत है अपने जेनरिक ठीक करें, और andThen का उपयोग कर है, जो केवल एक Function वापसी होगी के बजाय, आप लैम्ब्डा इनलाइन किए जाने वाले अपने आप से बेहतर हो जाएगा:

static <T1, T2, T3> Transformer<T1, T3> combine2(Transformer<T1, T2> first, Transformer<T2, T3> second) { 
    return (Message<T1> input) -> second.apply(first.apply(input)); 
} 
5

पहली समस्या है कि andThen लेता है एक फ़ंक्शन का रिटर्न वैल्यू और अगले फंक्शन के पैरामीटर प्रकार को बनाता है, इसलिए आपको @LouisWasserman बताता है, ताकि आउटपुट प्रकार के साथ अंत तक अंत तक उन्हें इनपुट प्रकार के साथ मिलान किया जा सके:

static <T1, T2, T3> Transformer<T1, T3> combine2(Transformer<T1, T2> first, Transformer<T2, T3> second) { 

दूसरी समस्या, जैसा कि वह समझाता है, Function.andThen है, जिसे आप कॉल कर रहे हैं, Function देता है, Transformer नहीं। नोट, हालांकि, Function और Transformer समान आकार है - एकल इनपुट, एकल आउटपुट। इस कारण से, आप एक का उपयोग करें और फिर इस तरह की एक विधि संदर्भ के साथ अन्य के लिए यह अनुकूलित कर सकते हैं:

static <T1, T2, T3> Transformer<T1, T3> combine(Transformer<T1, T2> first, Transformer<T2, T3> second) { 
    return first.andThen(second)::apply; 
} 

आप यह करने के लिए एक समारोह बनाने की जरूरत नहीं है। आप एक ही तकनीक Function.andThen() को सीधे फ़ोन का उपयोग कर सकते हैं:

Transformer<String,Integer> t1 = ... 
    Transformer<Integer,Double> t2 = ... 
    Transformer<Double,String> t3 = ... 

    Transformer<String,String> t123 = t1.andThen(t2).andThen(t3)::apply; 
+0

धन्यवाद @ हैकड और @ लुइस वासरमैन, मुझे बेहतर समझने में मदद मिली। मेरा मूल लक्ष्य कई कार्यों (उदाहरण के मामले में ट्रांसफार्मर) की सूची को जोड़कर और फिर चेन करके जोड़ना है। देखो मैं वास्तव में इस 'स्थिर की तरह प्रत्येक अतिरिक्त ट्रांसफार्मर के लिए विधि गठबंधन ट्रांसफार्मर गठबंधन (ट्रांसफार्मर पहले ट्रांसफार्मर दूसरा, ट्रांसफार्मर तीसरे) { वापसी first.andThen (ओवरराइड करने के लिए की जरूरत है सेकंड) .andThen (तृतीय) :: लागू होते हैं; } ' क्या यह अधिक सामान्य रूप से कार्यों की सूची को गठबंधन करने का एक बेहतर तरीका है? – Raja

+1

मैंने यह दिखाने के लिए अपना जवाब अपडेट कर दिया है कि आप यह कैसे कर सकते हैं –

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