2013-07-03 3 views
5

को संभालने के लिए स्वच्छ अमरूद तरीका मेरे पास एक विधि है जो Collection<Foo> foos पर तर्क लेती है, जो पूर्ण हो सकती है। मैं ImmutableSet के रूप में इनपुट की स्थानीय प्रति के साथ समाप्त करना चाहता हूं। अभी मेरा कोड इस तरह दिखता है:संभवतः शून्य संग्रह

if (foos == null) 
{ 
    this.foos = ImmutableSet.of(); 
} 
else 
{ 
    this.foos = ImmutableSet.copyOf(foos); 
} 

क्या ऐसा करने का कोई क्लीनर तरीका है? यदि foos एक साधारण पैरामीटर था, तो मैं Objects.firstNonNull(foos, Optional.of()) जैसे कुछ कर सकता था लेकिन मुझे यकीन नहीं है कि संग्रहों को संभालने के समान कुछ है या नहीं।

उत्तर

13

मैं नहीं दिख रहा है तुम क्यों Objects.firstNonNull उपयोग नहीं कर सका:

this.foos = ImmutableSet.copyOf(Objects.firstNonNull(foos, ImmutableSet.of())); 

आप स्थिर आयात के साथ कुछ टाइपिंग बचा सकता है, कि अगर आपकी बात है:

import static com.google.common.collect.ImmutableSet.copyOf; 
import static com.google.common.collect.ImmutableSet.of; 
// snip... 
this.foos = copyOf(Objects.firstNonNull(foos, of())); 
+5

+1 और यह इंगित करने लायक हो सकता है कि 'copyOf' इनपुट को वापस करने के लिए पर्याप्त स्मार्ट है यदि यह' इमटेबलसेट 'है। –

+1

@ पॉलबेलोरा मुझे विश्वास है कि आपने अभी किया है। ':)' –

+3

इसके अलावा 'अपरिवर्तनीय सेट। दुर्भाग्यवश () 'आवश्यक हो सकता है। –

7

एक Collection किसी अन्य की तरह एक संदर्भ है, तो आप कर सकता है:

ImmutableSet.copyOf(Optional.fromNullable(foos).or(ImmutableSet.of())); 

लेकिन वह लिखने के लिए काफी एक मुट्ठी भर होता जा रहा है। अधिक सरल:

foos == null ? ImmutableSet.of() : ImmutableSet.copyOf(foos); 
+0

दूसरे उदाहरण के लिए एक खाली संग्रह नहीं बनाने का लाभ होता है जब किसी की आवश्यकता नहीं होती है। मैटबॉल का जवाब हमेशा खाली 'सेट' बना देगा, भले ही पास किया गया संग्रह शून्य न हो। –

+5

@ जॉन बी 'ImmutableSet.of() '[एक सिंगलटन लौटाता है] (http://docs.guava-libraries.googlecode.com/git/javadoc/src-html/com/google/common/collect/ImmutableSet.html# line.83)। –

+0

आह, निश्चित रूप से यह करता है! खुश होती है। –

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