2016-07-26 34 views
8

में म्यूटेबल मैप पर इम्यूटेबल मैप कॉपी करें यदि मेरे पास immutableMap: Map<String, Int> है और इसे mutableMap: MutableMap<String, Int> में परिवर्तित करना चाहते हैं, तो ऐसा करने का सबसे अच्छा तरीका क्या होगा? किसी भी सुविधाजनक तरीके से प्रतीत नहीं होता है।कोटलिन

उत्तर

6

निम्न एक्सटेंशन फ़ंक्शन Map को MutableMap पर कॉपी करके काम करता है।

fun <K, V> Map<K, V>.toMutableMap(): MutableMap<K, V> { 
    return HashMap(this) 
} 
9

सबसे पहले, के रूप में पिछले प्रश्न Kotlin के बारे में केवल संग्रह और उनकी अचल स्थिति को पढ़ने में शामिल हैं, वे वास्तव में केवल संभावना परिवर्तनशील संग्रह के विचारों रहते पढ़े जाते हैं।

Kotlin सुरक्षित रूप से, के बाद से वहाँ इंटरफेस है कि Kotlin पता पर मार्कर हैं इन के लिए अस्थिरता के लिए प्रकार की जांच कर सकते हैं, उदाहरण के लिए:

// assuming some variable readOnlyMap of type Map<String, String> 

val mutableMap: MutableMap<String, String> = if (readOnlyMap is MutableMap<*,*>) { 
    readOnlyMap as MutableMap 
} else { 
    HashMap(readOnlyMap) 
} 

यह is जांच आंतरिक TypeIntrinsics.isMutableMap कॉल करता है और के लिए एक वैध तरीका है पता है कि यह जाति योग्य है या नहीं। यदि आप पहले यह चेक करते हैं तो कलाकार में कोई खतरा नहीं है। आप ध्यान दें कि कंपाइलर पूरी तरह से खुश है और बिना चेतावनी के। यह खतरनाक हो सकता है यदि आप उसी मानचित्र को केवल पढ़ने के लिए संशोधित करने का इरादा नहीं रखते हैं, लेकिन यह दिखाता है कि आप प्रभावित होने के लिए जा सकते हैं।

यदि आप अपने मूल मानचित्र को संशोधित करने का मौका नहीं चाहते हैं, तो निश्चित रूप से हमेशा एक मानचित्र, HashMap(readOnlyMap) के साथ हैश मैप के कन्स्ट्रक्टर को कॉल करके हमेशा एक प्रति बनाएं। या फिर एक विस्तार कार्य करना:

fun <K, V> Map<K, V>.toMutableCopy() = HashMap(this) 

और यह कहते हैं:

val mutableMap = readOnlyMap.toMutableCopy() 

और अब आप अपने आसान तरीका है।

यह भी देखें:

+0

मुझे लगता है कि आपको हैश मैप के जेनरिक को स्पष्ट रूप से निर्दिष्ट करना चाहिए, अन्यथा आप प्लेटफ़ॉर्म कुंजी/मान प्रकार वाले मानचित्र के साथ समाप्त हो जाएं। –

+2

मैं 'म्यूटेबल मैप' चेक के खिलाफ सलाह दूंगा क्योंकि यह जावा संग्रहों के लिए 'सत्य' वापस कर सकता है जो वास्तव में म्यूटेबल नहीं हैं। उदाहरण के लिए 'संग्रह .unmodifiableMap (mutableMapOf ("a" से "b") आज़माएं) MutableMap <*,*> 'है। –

+0

यह मेरे लिए सबसे अच्छा जवाब जैसा दिखता है। एक चीज जो आप जोड़ सकते हैं वह एक उदाहरण है जो सीधे 'हैश मैप' का उपयोग नहीं करता है (मुझे विश्वास है कि 'mutableMapOf' वास्तव में' LinkedHashMap' का उपयोग करता है)। उदाहरण: 'वैल mutableMap = map.entries.associateTo (mutableMapOf()) {प्रविष्टि -> entry.toPair()}'। – mfulton26