2012-06-26 10 views
8

मैं सूची से शून्य मूल्यों को हटाने के लिए कुछ सुरुचिपूर्ण समाधान के लिए चारों ओर देख रहा था। मैं following post भर में आया था, जो कहता है कि मैं उपयोग कर सकते हैं list.removeAll(Collections.singletonList(null));सिंगलटनलिस्ट का उपयोग क्या है?

लेकिन यह एक UnsupportedOperationException, जो मैं कर रहा हूँ यह सोचते है removeAll() अपरिवर्तनीय सिंगलटन संग्रह पर कुछ mutative आपरेशन करने के लिए प्रयास कर रहा है क्योंकि फेंकता है। क्या ये सही है?

यदि ऐसा है, तो इस सिंगललिस्ट का सामान्य उपयोग क्या होगा? आकार 1 के संग्रह का प्रतिनिधित्व करने के लिए जब आप सुनिश्चित हैं कि आप वास्तव में संग्रह के साथ कुछ भी नहीं करना चाहते हैं?

अग्रिम धन्यवाद।

+0

आपने सूची कैसे घोषित की है? Arrays.asList() का उपयोग करना? यदि ऐसा है तो यह अपरिवर्तनीय होगा – Murugesh

उत्तर

14

यह एक आकर्षण की तरह काम करता है:

List<String> list = new ArrayList<String>(); 
list.add("abc"); 
list.add(null); 
list.add("def"); 
list.removeAll(Collections.singletonList(null)); 
System.out.println(list); //[abc, def] 

दरअसल Collections.singletonList(null) अपरिवर्तनीय है (जो दुर्भाग्य से जावा में छिपा [1] है), लेकिन अपवाद अपने list चर से फेंक दिया है। जाहिर है यह रूप में अच्छी तरह अपरिवर्तनीय है, नीचे दिए गए उदाहरण की तरह:

List<String> list = Arrays.asList("abc", null, "def"); 
list.removeAll(Collections.singletonList(null)); 

इस कोड एक UnsupportedOperationException फेंक देते हैं। इसलिए आप इस मामले में singletonList() देख सकते हैं। इसका उपयोग करें जब क्लाइंट कोड केवल पढ़ने-योग्य सूची की अपेक्षा करता है (यह इसे संशोधित नहीं करेगा) लेकिन आप केवल इसमें एक तत्व को पास करना चाहते हैं। singletonList() (थ्रेड-) सुरक्षित है (अपरिवर्तनीयता के कारण), तेज़ और कॉम्पैक्ट।

[1] उदा। में परिवर्तनशील और अपरिवर्तनीय संग्रह और एपीआई के लिए एक separete पदानुक्रम है चुन सकते हैं कि यह (या दोनों के रूप में वे आम आधार इंटरफेस है) इस या अन्य स्वीकार

+0

यह वही है जो मैं चाहता था। मुझे पता नहीं था कि 'Arrays.asList()' एक अपरिवर्तनीय सूची देता है (हालांकि मुझे यह याद रखना याद है कि इसे "उस सरणी द्वारा समर्थित किया गया था")। इसे 'ऐरेलिस्ट (संग्रह सी)': 'नया ऐरेलिस्ट (Arrays.asList (someArray)) के निर्माता का उपयोग करके तय किया जा सकता है। RemoveAll (संग्रह .singletonList (null))' – mmoore

0

है अपनी सूची Collections.unmodifiableList (सूची) के साथ संरक्षित कर ? क्योंकि अगर आपने इसे संरक्षित किया है और इसे बाद में संशोधित करने का प्रयास किया है तो आपको वह त्रुटि मिल जाएगी।

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