2015-09-18 9 views
6

लौटने पर मेरे पास कई विधियां हैं, जो प्रत्येक वैकल्पिक स्ट्रिंग लौट रहे हैं। मैं तब कैसे गठबंधन करूं, ताकि जावा प्रत्येक विधि को कॉल करे, जब तक इसका नतीजा न हो?कैस्केड विधियों, प्रत्येक जावा 8 वैकल्पिक <>

मैं कुछ इस तरह से खत्म करना चाहते हैं, लेकिन वहाँ orElseFlatMap() तरीका नहीं है:

import java.util.Optional; 

public class OptionalCascade { 

    public static void main(String[] args) { 
     Optional<String> result = 

       // try to get a result with method A 
       methodA() 

       // if method A did not return anything, then try method B 
       .orElseFlatMap(methodB()); 
    } 


    static Optional<String> methodA() { 
     return Optional.empty(); 
    } 

    static Optional<String> methodB() { 
     return Optional.empty(); 
    } 
} 
+0

क्या आप परिणाम प्राप्त करते ही शॉर्ट-सर्किट करना चाहते हैं? उस स्थिति में आप केवल निर्माण में विधि आमंत्रण नहीं डाल सकते हैं। आपको लैम्बडास में कॉल लपेटना होगा (जैसे 'orElseGet (() -> methodB()' –

+0

मैं बस पुराने पुराने के साथ रहूंगा यदि अन्यथा और नल :) – ZhongYu

उत्तर

0

आप एक Chain-of-responsibility pattern की तरह कुछ जहां मूल रूप से आप बस अपना पहला विधि कॉल कर सकते हैं। फिर अपनी पहली विधि के अंदर यदि आप परिणाम वापस कर सकते हैं तो इसे वापस कर दें। यदि यह खाली है तो अपने उत्तराधिकारी विधि को कॉल करें।

+0

आपके उत्तर के लिए धन्यवाद। हालांकि मैं मेरे विकल्प के संयोजन के लिए कार्यात्मक वाक्यविन्यास में जावा 8 समाधान की तलाश में है। मैं/else, आदि से बचना चाहता हूं। – slartidan

4

मान लिया जाये कि आप मानक तरीकों का उपयोग करना चाहते हैं और एकल अभिव्यक्ति समाधान है, मैं इस के साथ ही आ सकते हैं:

Optional<String> result = Optional.ofNullable(methodA().orElseGet(
     () -> methodB().orElse(null))); 

बदसूरत। वैकल्पिक रूप से आप अपनी खुद की स्थैतिक विधि लिख सकते हैं:

public static <T> Optional<T> orElseFlatMap(Optional<T> optional, 
     Supplier<Optional<T>> other) { 
    return optional.isPresent() ? optional : other.get(); 
} 

Optional<String> result = orElseFlatMap(methodA(),() -> methodB()); 
+0

कामकाज के लिए अच्छे सुझाव - लेकिन अभी भी "समाधान" नहीं है जिसे मैं ढूंढ रहा हूं ... :(आपके उत्तर के लिए धन्यवाद , वैसे भी। – slartidan

+1

@ स्लार्टिडन, शायद आपको परिणाम को वैकल्पिक के रूप में स्टोर करने की आवश्यकता नहीं है। बस 'स्ट्रिंग परिणाम = methodA()। याEseseGet (() -> methodB()। याEsese (whatEver)) का उपयोग करें; ' –

+0

I मान लें कि ओपी इस तरह से दो से अधिक तरीकों को कैस्केड करना चाहता है। इस दृष्टिकोण के परिणामस्वरूप सिंकैक्स को कैस्केड करने के बजाय घोंसले में परिणाम मिलता है। –

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