2015-06-17 14 views
5

की सूची से पहले गैर खाली वैकल्पिक कैसे प्राप्त करें मैं धाराओं और लैम्ब्स के उपयोग के लिए कोशिश कर रहा हूं (कभी-कभी खुद को मजबूर कर रहा हूं), और मैं अभी तक उनके साथ सहज नहीं हूं। वैकल्पिक <T>

मेरे पास एक वर्ग में कुछ विधियां हैं जो व्यावसायिक वस्तु को मान्य करती हैं। हर विधि लग रहा है

तरह
Optional<Fail> validate1(BusinessObject bo) 

जहां असफल एक enum है कि किसी तरह त्रुटि का वर्णन करता है, और कोई त्रुटि है, तो विधि Optional.empty रिटर्न()। मुझे सभी त्रुटियों को इकट्ठा करने की आवश्यकता नहीं है, लेकिन निम्नलिखित मान्यताओं को निष्पादित किए बिना पहली त्रुटि लौटाएं।

क्या मैं कर रहा हूँ

//first convert methods to suppliers 
Supplier<Optional<Fail>> validate1=() -> validate1(bo); 
Supplier<Optional<Fail>> validate2=() -> validate2(bo); 
Supplier<Optional<Fail>> validate3=() -> validate3(bo); 
//then some stream magic 
return Stream.of(validate1, validate2, validate3) 
    .map(Supplier::get) 
    .filter(f -> f.isPresent()) 
    .findFirst() 
    .orElse(Optional.empty()); //without the orElse, no error would return 
             // Optional(Optional.empty()) 
             // instead of Optional.empty() 

यह काम करता है, यह काम, यह अनावश्यक तरीकों पर अमल नहीं करता है, यह सुपाठ्य है (यह अगर Optional.orElse getOrElse नाम थे अधिक स्पष्ट होगा, लेकिन है यह मेरी पहुंच से बाहर है)। जो मैं खोजना चाहता हूं वह यह है कि यदि मैं चाहता हूं कि यह करने का एक उचित तरीका है, तो इस कोड को 'अच्छी शैली' या 'मूर्खतापूर्ण जावा 8' माना जाएगा, या क्या मैं स्ट्रीम या वैकल्पिक का दुरुपयोग कर रहा हूं, या कुछ स्पष्ट याद कर रहा हूं।

पहले गैर-खाली वैकल्पिक या खाली विकल्प लौटने का विचार अगर वे सभी खाली दिखते हैं तो यह सोचने के लिए पर्याप्त सामान्य है कि ऐसा करने का आधिकारिक तरीका है, मेरे सिर के पीछे कुछ 'मोनाड्स' चिल्ला रहा है! , लेकिन हास्केल की मेरी अज्ञानता लगभग सही है, इसलिए मुझे नहीं पता।

+0

काफी उचित कोड की तरह लग रहा अंदाज। –

+0

यदि मैं आप थे तो मैं शायद आपूर्तिकर्ता का उपयोग करने के बजाय 'Stream.of (validate1 (bo), validate1 (bo), validate1 (bo)) करूँगा। – Jatin

+0

@ जेटिन जो तुरंत सभी मान्य तरीकों को कॉल करेगा। ओपी केवल उन्हें आवश्यकतानुसार कॉल करना चाहता है। – Misha

उत्तर

2

OptionalStream जैसे 0 या 1 तत्वों के साथ बहुत कुछ है। फिर भी यह Stream लागू नहीं करता है, न ही यह stream() विधि (जैसे संग्रह करता है) है।

हालांकि, यह नहीं है कि कठिन एक Optional<T> एक Stream<T> में कनवर्ट कर रहा है, इस समारोह यह करता है:

public static <T> Function<Optional<? extends T>, Stream<T>> asStream() { 
    return op -> op.map(Stream::of).orElseGet(Stream::empty); 
} 

कि विधि आप बस flatMap उपयोग कर सकते हैं उपलब्ध है:

Stream.of(validate1, validate2, validate3) 
     .map(Supplier::get) 
     .flatMap(asStream()) 
     .findFirst(); 
+0

जावा 9 [होगा] (http://download.java.net/jdk9/docs/api/java/util/Optional.html#stream--)। फिर भी, '.flatMap (asStream()) 'या जावा 9 का' .flatMap (वैकल्पिक :: स्ट्रीम) '' फ़ील्टर (वैकल्पिक :: isPresent) से अलग नहीं है। मैप (वैकल्पिक :: प्राप्त करें)'। यह सामान्य रूप से अवधारणा की वैधता के बारे में ओपी के सवाल का जवाब नहीं देता है ... – Holger

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