Google अमरूद संग्रह के लिए NullOrEmpty है


102

मुझे लगता है कि अमरूद स्ट्रिंग्स के लिए NullOrEmpty उपयोगिता विधि है

Strings.isNullOrEmpty(str)

क्या हमारे पास सूचियों के लिए कुछ समान है? कुछ इस तरह

Lists.isNullOrEmpty(list)

के बराबर होना चाहिए

list == null || list.isEmpty()

इसके अलावा, क्या हमारे पास एरे के लिए कुछ समान है? कुछ इस तरह

Arrays.isNullOrEmpty(arr)

के बराबर होना चाहिए

arr == null || arr.length == 0

जवाबों:


141

नहीं, यह विधि अमरूद में मौजूद नहीं है और वास्तव में हमारे "विचार कब्रिस्तान" में है।

हम नहीं मानते कि "अशक्त या खाली है" एक प्रश्न है जिसे आप वास्तव में संग्रह के बारे में पूछना चाहते हैं।

यदि कोई संग्रह शून्य हो सकता है, और अशक्त को खाली के समान माना जाना चाहिए, तो उस तरह से अस्पष्टता से सब कुछ प्राप्त करें, जैसे:

Set<Foo> foos = NaughtyClass.getFoos();
if (foos == null) {
  foos = ImmutableSet.of();
}

या इस तरह (यदि आप चाहें):

Set<Foo> foos = MoreObjects.firstNonNull(
    NaughtyClass.getFoos(), ImmutableSet.<Foo>of());

उसके बाद, आप .isEmpty()सामान्य की तरह उपयोग कर सकते हैं । शरारती एपीआई को कॉल करने पर तुरंत ऐसा करें और आपने इसे अनिश्चित काल तक जारी रखने के बजाय अपने पीछे अजीब तरह से डाल दिया है।

और अगर "शून्य जिसका वास्तव में मतलब है कि खाली संग्रह" आपके लिए वापस नहीं किया जा रहा है, लेकिन आपके पास गया है, तो आपका काम आसान है: बस NullPointerExceptionफेंक दिया जाए, और उस कॉलर को आकार दें।


7
क्या होगा अगर कुछ फ्रेमवर्क इसे शून्य करने के लिए फ़ील्ड सेट कर रहा है और आप इसे नियंत्रित नहीं कर सकते हैं (सूची में बाइंडिंग पर स्प्रिंग फ्रेमवर्क) हालांकि आप स्पष्ट रूप से ऑब्जेक्ट में खाली सूची सेट और उपयोग करते हैं।
ओमेक्स

15
मेरा उत्तर एक ही है: nullजितनी जल्दी हो सके एक खाली संग्रह को सामान्य करके अस्पष्टता को दूर करने का प्रयास करें । यदि आप अभी नहीं कर सकते हैं, तो ठीक है, आप उन 1% उपयोगकर्ताओं में से एक हो सकते हैं जो वास्तव में अपना स्वयं का तुच्छ isNullOrEmpty (संग्रह) सहायक लिखना चाहते हैं।
केविन बोर्रिलिन

8
(या सहायक को छोड़ दें और सिर्फ if (collection == null || collection.isEmpty())उन मामलों में लिखें जहां आपको इसकी आवश्यकता है! क्या यह इतना बुरा है?)
केविन बॉरिलिन

13
यह एक राय है कि वास्तव में इस सवाल का जवाब नहीं है। यह रक्षात्मक प्रोग्रामिंग सिद्धांतों के खिलाफ भी जाता है।
नवबंर

11
@ नोवाइब्रेंट चूंकि सवाल अमरूद पुस्तकालय की क्षमताओं के बारे में है, और इसका जवाब अमरूद के प्रमुख डेवलपर में से एक से है, इसका जवाब थोथा है: "नहीं, अमरूद में ऐसा नहीं है"। उत्तर को उस कथन के साथ शुरू करके सुधार किया जा सकता है, हालांकि :)
ग्रुंडफ्लेक

37

एक बात जो आपको अमरुद में देखने को मिलेगी, वह यह है कि वे बहुत विरोधी हैं null। लेखक nullजितना संभव हो उतना उपयोग करने से आपको हतोत्साहित करना चाहते हैं, और उपयोगिता के तरीके प्रदान करना आसान बनाने के लिए उपयोग nullकरना इस अंत के खिलाफ प्रतिशोधात्मक होगा।

यदि आप अमरूद के प्रतिमान का उपयोग करना चाहते हैं, तो विचार करें कि क्या इस संग्रह का स्रोत (या सरणी) वास्तव में वैकल्पिक रूप से वापस लौटना चाहिए null। यदि नहीं, तो इसे चिह्नित करने पर विचार करें @NonNullऔर इसके बजाय खाली संग्रह लौटाएं null। या एक फ़ंक्शन के पैरामीटर के रूप में जो बिना null-सूची वाली सूचियों की अपेक्षा कर रहा है Preconditions.checkNotNull, का उपयोग करने पर विचार करें , जो एक अपवाद null( यदि अप्रत्याशित रूप से) में पारित हो गया है तो फेंकता है।

यदि nullवास्तव में वैध है, तो list == null || list.isEmpty()क्या यह कठिन नहीं है।


9
यह असंगत है। वही तर्क स्ट्रिंग्स के लिए बनाया जा सकता है, फिर भी वहाँ है एक Strings.isNullOrEmpty ()
डॉन चीडल

29

कॉमन्स- कलेक्शंस में एक CollectionUtils.isEmpty () है।


1
दुर्भाग्य से, ऐसा लगता है कि इसे हाल के संस्करणों में हटा दिया गया है। Org.apache.commons.collections15.CollectionUtils देखें।
स्पाकार्की 21

1
Apache.commons.collection से Javadoc को देखते हुए तरीके ismmpty () और isNotEmpty () अभी भी नवीनतम संस्करण में मौजूद हैं। collection15.CollectionUtils जेनेरिक समर्थन प्रदान करने की कोशिश कर रही एक स्वतंत्र परियोजना की तरह लगता है।
प्रको

1
जब आप सामने वाले कोड को बदल नहीं सकते, तब लेगेसी ऐप्स के साथ काम करते समय CollectionUtils.isEmpty () उपयोगी होता है।
जेरोम डलबर्ट

1
हम यह जानते हैं, लेकिन कोई अमरूद के बारे में नहीं अपाचे कॉमन्स के बारे में पूछ रहा था।
क्ररा

9

स्प्रिंग फ्रेमवर्क में विशेष उपयोग वर्ग कहा जाता है CollectionUtils। और विधि आप के लिए देख रहे हैं: org.springframework.util.CollectionUtils.isEmpty। यह अशक्त और खाली संग्रह के लिए सही है।

और सरणियों के लिए org.springframework.util.ObjectUtils.isEmptyविधि है जो बहुत समान व्यवहार करती है।


5
हालांकि इसका उपयोग करना संभवतः सुरक्षित है, इस वर्ग को "रूपरेखा के भीतर आंतरिक उपयोग के लिए मुख्य रूप से" टिप्पणी के साथ चिह्नित किया गया है। इसका अर्थ है कि इसका इंटरफ़ेस स्प्रिंग अपग्रेड पर बदल सकता है और इसे फिर से काम करने के लिए आपको अतिरिक्त काम करना होगा।
माइक मिनिकी

2

Apache CollectionUtils 4 में एक विधि CollectionUtils.emptyIfNull () है जो संग्रह खाली होने पर एक खाली सूची देता है। यह एक फॉर्च लूप में बहुत उपयोगी है, इसलिए आपको पुनरावृत्ति करने से पहले एक अशक्त जांच करने की आवश्यकता नहीं है


1

मेरा समाधान है: MoreObjects.firstNonNull (सूची, संग्रह। खाली सूची ())

मैं JDK संग्रह के साथ अमरूद MoreObjects का उपयोग कर रहा हूं।

 @Test
public void listnull() {
List<String> list = null;

for (String str : MoreObjects.firstNonNull(list, Collections.<String> emptyList())) {
    System.out.println(str);
}

list = new ArrayList<String>();
list.add("http://stackoverflow.com/");

for (String str : MoreObjects.firstNonNull(list, Collections.<String> emptyList())) {
    System.out.println(str);
}
}

1
यह वही है जो शीर्ष उत्तर में सुझाया गया है , सिवाय इसके कि आप उपयोग नहीं करते हैं ImmutableList
dimo414

मुझे लगता है कि नकारात्मक क्योंकि एक apache commons तरीकों की तरह सरल और त्वरित समाधान चाहता था inNotEmpty ...
को Kra

सहायता केंद्र> विशेषाधिकार> वोट डाउन मुझे वोट कब देना चाहिए? जब भी आपका सामना किसी घटिया, अनाप-शनाप पोस्ट, या स्पष्ट रूप से और खतरनाक तरीके से किया गया उत्तर हो, तो अपने डाउनवोट का उपयोग करें। आपके पास प्रति दिन सीमित संख्या में वोट होते हैं, और उत्तर देने वाले वोटों की कीमत आपके ऊपर बहुत कम होती है; उन्हें बुद्धिमानी से उपयोग करें। stackoverflow.com/help/privileges/vote-down
जेटीएन

क्या आपको लगता है कि मेरा उत्तर "उदात्त रूप से टेढ़ा-मेढ़ा, नो-प्रयास-विस्तारित पोस्ट, या एक ऐसा उत्तर है जो स्पष्ट रूप से और शायद खतरनाक रूप से गलत है"? यदि नहीं, तो आप नकारात्मक मतदान क्यों कर रहे हैं?
जेटन

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.