2015-12-22 50 views
7

में कोई सूची खाली है या नहीं, यह जांच कर रहा हूं कि मैं जावा 8 में नया हूं। मैंने सूचियां और फ़िल्टर लागू किए हैं। मैंने अपने कोड में एक शून्य जांच की है। मैं एक ही कोड स्निपेट में सूची खाली नहीं है या नहीं, यह जांचने के लिए कुछ मदद की सराहना करता हूं। यदि सूची खाली नहीं है तो कोड को दावे के साथ आगे बढ़ना चाहिए।जावा 8

list.stream().filter(listElement -> listElement != null). 
    forEach((listElement) -> Assert.assertEquals(
     ValueType.CANDY, 
     listElement.getCandyType())); 

उत्तर

12

आप एक अप्रचलित प्रश्न पूछ रहे हैं। धाराएं स्रोत के सभी तत्वों को संसाधित करती हैं, इसलिए यदि कोई तत्व नहीं है, तो कोई कार्रवाई नहीं की जाएगी। इसलिए, आपको यह जांचने की आवश्यकता नहीं है कि सूची खाली है या नहीं।

list.stream().filter(Objects::nonNull) 
    .map(listElement -> listElement.getCandyType()) 
    .forEach(candyType -> Assert.assertEquals(ValueType.CANDY, candyType)); 

या

Assert.assertTrue(list.stream().filter(Objects::nonNull) 
         .map(listElement -> listElement.getCandyType()) 
         .allMatch(Predicate.isEqual(ValueType.CANDY)); 

allMatch इस चेक के लिए आवश्यक नियमों का पालन करती:

फिर भी, आप अपने कोड को आसान बनाने में कर सकते हैं। यदि कोई तत्व नहीं है, तो कोई विरोधाभासी तत्व नहीं है, इसलिए सभी मैच से मेल खाते हैं। ध्यान दें कि listElement -> listElement.getCandyType() को ClassName::getCandyType फ़ॉर्म के विधि संदर्भ द्वारा प्रतिस्थापित किया जा सकता है; मैंने इसे यहां नहीं किया क्योंकि मुझे सही वर्ग का नाम नहीं पता है।

दोनों प्रकारों के बीच कोई प्रदर्शन अंतर नहीं है। पहले गैर-मिलान तत्व का सामना करते समय allMatch तत्काल वापस आ जाएगा, और assertEquals पहले गैर मिलान तत्व पर फेंक देगा। दूसरे मामले में, स्टैक ट्रेस स्ट्रीम एपीआई कार्यान्वयन की कलाकृतियों को नहीं दिखाएगा।

दूसरी बार प्राथमिकता दी जाती है जब आप यूनिट परीक्षणों के बजाय उत्पादन कोड के लिए चेक प्रदान करते हैं और जावा भाषा assert सुविधा के साथ इन चेक को बंद करने की अनुमति देते हैं, उदा।

assert list.stream().filter(Objects::nonNull) 
      .map(listElement -> listElement.getCandyType()) 
      .allMatch(Predicate.isEqual(ValueType.CANDY)); 

के रूप में इस फार्म की गारंटी देता है कि वहाँ कोई भूमि के ऊपर जब दावे बंद कर दिया जाता है, जबकि पहले संस्करण का, forEach कार्रवाई के साथ एक assert बयान होने हो जाएगा अभी भी सभी तत्वों से अधिक पुनरावृत्ति और के मध्यवर्ती कदम उठाने का कारण बन सकते पाइप लाइन।

+0

आपके दृष्टिकोण का नुकसान यह है कि विफलता के मामले में मूल कोड "अपेक्षित कैंडी जैसा था लेकिन वास्तविक था: SHMANDY" जैसा वास्तविक गैर-मिलान मूल्य प्रदर्शित करेगा, जबकि आपका कोड केवल इतना कहता है कि दावा विफल हुआ। –

+0

@ टागीर वैलेव: मेरा पहला संस्करण अभी भी ऐसा करता है। हालांकि यह बहस योग्य है कि क्या वह जानकारी वास्तव में मदद करती है। हो सकता है कि इंडेक्स अधिक सहायक हो, शायद * अन्य * गैर-मेलिंग आइटम, यदि कुछ हैं ... आमतौर पर, इतिहास जो गलत स्थिति को जन्म देता है वह है जो आपको चाहिए, लेकिन यह कुछ है, न तो संस्करण वितरित कर सकता है। – Holger

+0

धन्यवाद। मैंने आपका उत्तर चुना। यह मेरे कोड पर भी बहुत स्पष्ट और सुधार हुआ था। –

4

बाहर चेक isEmpty विधि

if (list.isEmpty()) { ... } 

यहाँ डॉक है: https://docs.oracle.com/javase/7/docs/api/java/util/List.html#isEmpty()

+0

धन्यवाद, लेकिन मैं इसे कैसे Java8 की धारा में जाँच की जा सकता है की वाक्य रचना में जानना चाहता था –

+4

यदि सूची खाली है, तो जोर किसी भी तरह नहीं होगा, क्योंकि – Buddy

1

जोर देते हुए सूची में से किसी विशेष तत्व किसी न किसी रूप है जिसमें जोर देकर कहा कि सूची खाली है एक अलग बात है (यानी getCandyType() == ValueType.CANDY)। दोनों विचारों को एक साथ बांधने की कोशिश करना सिर्फ चीजों को करने का सही तरीका नहीं है।

आप क्या करने की जरूरत एक दूसरे दावे को जोड़ने के लिए, या तो पहले या forEach के बाद, जो करता है

assertThat(list.isEmpty(), not(equalTo(Boolean.FALSE))) 

... या इसी तरह कुछ भी नहीं है।

खाली सूचियों के बारे में प्रमुख बिंदुओं में से एक यह है कि उन्हें तत्वों वाले सूचियों के रूप में संसाधित किया जा सकता है। यही कारण है कि Optional class और Null pattern जैसी चीजें मौजूद हैं। तो यदि आप वास्तव में परवाह करते हैं कि सूची खाली है तो आप वास्तव में इसे एक अलग, विशिष्ट दावा कर सकते हैं।

+0

पर लूप के लिए कोई तत्व नहीं होगा यदि इन उपयोगिता विधियों का उनके नाम का सुझाव है, 'नहीं (बराबर (Boolean.FALSE)) 'सत्य 'कहने का काफी असफल तरीका है ... – Holger

+0

@ होल्गर, मुझे लगता है कि वे स्वचालित रूप से त्रुटि संदेश को प्रारूपित करने में भी सक्षम हैं (जैसे कुछ" यह एफ के बराबर नहीं था वरना ")। हालांकि इस तरह की verbosity यहाँ बिल्कुल अनावश्यक है। –

+1

@ होल्गर आप सही हैं, सबसे अच्छा दावा शायद हैमक्रिस्ट 'IsEmptyCollection.empty() 'matcher -' assertThat (सूची, नहीं (खाली())) का उपयोग करेगा। – sisyphus

6

चुना जवाब है, बहुत अच्छा है की Optional.ofNullable साथ अशक्त मामले को संभालने के लिए एक छोटा सा सुझाव newly introduced to Java8 Optional class:

Optional.ofNullable(list) 
      .orElseGet(Collections::emptyList) 
      .stream().filter(Objects::nonNull) 
      .map(listElement -> listElement.getCandyType()) 
      .forEach(candyType -> Assert.assertEquals(ValueType.CANDY, candyType)););