2015-02-19 17 views
19

मान लें कि मैं देखना चाहता हूं कि कोई ऑब्जेक्ट स्ट्रीम में मौजूद है या नहीं, और यदि यह मौजूद नहीं है, तो अपवाद फेंक दें। रिवर्स मेंएक वैकल्पिक <> मौजूद है

List<String> values = new ArrayList<>(); 
values.add("one"); 
//values.add("two"); // exception thrown 
values.add("three"); 
String two = values.stream() 
     .filter(s -> s.equals("two")) 
     .findAny() 
     .orElseThrow(() -> new RuntimeException("not found")); 

के बारे में क्या: एक तरह से मुझे लगता है कि कर सकता है orElseThrow विधि का उपयोग किया जाएगा? मैं एक अपवाद फेंक करना चाहते हैं यदि कोई मिलान हो जाता है:

String two = values.stream() 
     .filter(s -> s.equals("two")) 
     .findAny() 
     .ifPresentThrow(() -> new RuntimeException("not found")); 

मैं सिर्फ Optional संग्रहीत कर सकती है, और कर isPresent जांच के बाद:

Optional<String> two = values.stream() 
     .filter(s -> s.equals("two")) 
     .findAny(); 
if (two.isPresent()) { 
    throw new RuntimeException("not found"); 
} 

वहाँ किसी भी तरह से इस ifPresentThrow प्रकार प्राप्त करने के लिए है व्यवहार का? इस तरह से एक बुरा अभ्यास फेंकने की कोशिश कर रहा है?

values.stream() 
      .filter("two"::equals) 
      .findAny() 
      .ifPresent(s -> { 
       throw new RuntimeException("found"); 
      }); 
+3

'orElseThrow' की बात त्रुटि हैंडलिंग यदि मान मौजूद नहीं है के साथ एक गैर वैकल्पिक करने के लिए मूल्य कन्वर्ट करने के लिए है। जैसा कि आप रुचि रखते हैं, यदि मूल्य मौजूद है, तो इस उद्देश्य के लिए डिज़ाइन की गई विधि का उपयोग क्यों न करें: 'isPresent'? –

उत्तर

15

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

+10

या '.anyMatch (" दो ":: बराबर) ' – Misha

+5

@ मिशा का व्युत्पन्न: यह दुर्लभ मामलों में से एक है जहां लैम्ब्डा अभिव्यक्ति अधिक कुशल है क्योंकि यह कैप्चर नहीं करती है कोई भी मान (जैसा कि "दो" 'संकलन-समय स्थिर है)। इसके विपरीत, विधि संदर्भ हमेशा उस उदाहरण को कैप्चर करेगा जिस पर विधि लागू की जानी चाहिए। – Holger

+0

मुझे पता है @ होल्गर सही है, लेकिन मुझे यह मानना ​​है कि @ मिशा का "दो" :: बराबर' एक बहुत अच्छा वाक्यविन्यास है। प्रदर्शन के कुछ नॉनसेक्स प्राप्त करने के लिए यह कहना मुश्किल नहीं है :-) –

18

आप अपने फिल्टर कुछ भी पाता है एक अपवाद फेंक ifPresent() कॉल इस्तेमाल कर सकते हैं इस, और आप सब पर Optional उपयोग करने की आवश्यकता नहीं है:

if (values.stream().anyMatch(s -> s.equals("two"))) { 
    throw new RuntimeException("two was found"); 
} 
+0

यदि इसे प्रतिनिधि विधि में फेंक नहीं दिया जा सकता है। – jeon

+1

हां यह कर सकता है - निम्नलिखित निष्पादित करें। 'Optional.of (1) .ifPresent (s -> {नया रनटाइम अपवाद (" ओह एक अपवाद देखें ");});' – beresfordt

+0

केवल रनटाइम अपवाद को इस तरह से फेंक दिया जा सकता है – zmark

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