एक अमरूद ImmutableMap को इनिशियलाइज़ करना


140

अमरुद मानचित्र को आरम्भ करने के लिए एक अच्छा शॉर्टकट प्रदान करता है। हालाँकि, मुझे निम्न कंपाइलर त्रुटि (एक्लिप्स इंडिगो) मिलती है, जब मेरा नक्शा नौ प्रविष्टियों को इनिशियलाइज़ करता है।

of(K, V, K, V, K, V, K, V, K, V)प्रकार में विधि ImmutableMapतर्कों के लिए लागू नहीं है (String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String)

ImmutableMap<String,String> myMap = ImmutableMap.of(
        "key1", "value1", 
        "key2", "value2", 
        "key3", "value3", 
        "key4", "value4", 
        "key5", "value5", 
        "key6", "value6", 
        "key7", "value7", 
        "key8", "value8", 
        "key9", "value9"
        );

संदेश ऐसा प्रतीत होता है

एक ImmutableMap में कुंजी, मूल्य के चार जोड़े का अधिकतम आकार होता है।

जाहिर है, यह मामला नहीं हो सकता है, लेकिन मैं अपने शुरुआती के आकार को बढ़ाने के लिए क्या कर सकता हूं इसका पता नहीं लगा सकता।

क्या कोई मुझे बता सकता है कि क्या गायब है?

जवाबों:


256

ध्यान दें कि आपके त्रुटि संदेश में केवल पाँच K, Vजोड़े, 10 तर्क हैं। यह डिजाइन द्वारा है; ImmutableMap वर्ग छह अलग-अलग of()तरीके प्रदान करता है , जो शून्य और पांच कुंजी-मूल्य युग्मों के बीच स्वीकार करता है । वहाँ एक of(...)अधिभार नहीं है एक varags पैरामीटर स्वीकार क्योंकि Kऔर Vविभिन्न प्रकार हो सकते हैं।

आप एक चाहते हैं ImmutableMap.Builder:

ImmutableMap<String,String> myMap = ImmutableMap.<String, String>builder()
    .put("key1", "value1") 
    .put("key2", "value2") 
    .put("key3", "value3") 
    .put("key4", "value4") 
    .put("key5", "value5") 
    .put("key6", "value6") 
    .put("key7", "value7") 
    .put("key8", "value8") 
    .put("key9", "value9")
    .build();

त्वरित उत्तर के लिए धन्यवाद। मैंने अमरूद की कोशिश करने का फैसला किया क्योंकि मैं एक मानक मानचित्र इनिशियलाइज़र द्वारा आवश्यक सभी 'पुट' टाइप करना नहीं चाहता था। उस विचार के लिए बहुत बहुत धन्यवाद!
user903724

7
@ user903724: यहां अमरूद का उपयोग करने का मुख्य कारण मजबूत अपरिवर्तनीयता, IMO है।
जॉन स्कीट

2
कि, या थोड़ा कम स्मृति की खपत - और बिल्डर वाक्यविन्यास बहुत धाराप्रवाह है, जैसा कि चीजें जाती हैं।
लुइस वास्समैन

2
ठीक है, आपके पास कई पुट हो सकते हैं, लेकिन वे अब धाराप्रवाह एपीआई का उपयोग कर रहे हैं, इसलिए myMapप्रत्येक के लिए दोहराने की आवश्यकता नहीं है.put
केविन वेलकर

21
यह भी देखें कि जॉन का उदाहरण कोड कैसे हो सकता है public static finalऔर यह अभी भी काम करता है, किसी सहायक विधि या static{}इनिशियलाइज़र की कोई आवश्यकता नहीं है!
बजे केविन बॉरबिल

62

अगर नक्शा छोटा है तो आप कर सकते हैं:

ImmutableMap.of(key, value, key2, value2); // ...up to five k-v pairs

यदि यह लंबा है तो:

ImmutableMap.builder()
   .put(key, value)
   .put(key2, value2)
   // ...
   .build();

9
पठनीयता के अलावा, आप ImmutableMap.ofपांच प्रमुख मूल्य जोड़े के लिए स्थैतिक कारखाने का उपयोग कर सकते हैं । फिर आपको बिल्डर का उपयोग करना होगा।
Xaerxess

0

"पुट" को हटा दिया गया है , इसे उपयोग करने से बचना चाहिए, इसके बजाय .of का उपयोग करें

ImmutableMap<String, String> myMap = ImmutableMap.of(
    "city1", "Seattle",
    "city2", "Delhi"
);

3
सं। ImmutableMap.put को पदावनत किया जाता है। जॉन स्कीट ImmutableMap.Builder.put का उपयोग कर रहा है, जो कि वास्तव में हमें 5 से अधिक tuples के साथ एक नक्शे को कैसे शुरू करना चाहिए।
IBB
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.