2016-04-25 7 views
8

मैं MutableMapwith defaults उपयोग करना चाहते हैं:डीफॉल्ट रैपर के साथ कैसे उपयोग करें?

val myMap = mutableMapOf<String, Set<String>>().withDefault { mutableSetOf() } 

लेकिन मैं getOrImplicitDefault विधि क्योंकि withDefault रिटर्न MutableMap<String, Set<String>> प्रकार का उपयोग नहीं कर सकते हैं। इसके अलावा, मैं MutableMapWithDefault इंटरफेस पर नहीं डाल सकता क्योंकि this is a private interface

मैं get विधि का उपयोग नहीं कर सकता क्योंकि यह एक शून्य प्रकार देता है। यह ठीक है क्योंकि यह MutableMap इंटरफ़ेस पर एक विधि है (इसके अलावा यह defaultValue डिफ़ॉल्ट मान लेने के लिए कॉलबैक नहीं कॉल करता है)।

ऐसा लगता है कि इस कार्यक्षमता को कोटलिन में सही ढंग से लागू नहीं किया गया है, या मैं इसे गलत उपयोग कर रहा हूं। तो, मैं withDefault रैपर का सही तरीके से उपयोग कैसे करूं?

+0

अमरूद ['SetMultimap'] (http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/SetMultimap.html) या [' लोडिंग कैश'] (http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/cache/LoadingCache.html) जो आप पूरा करने की कोशिश कर रहे हैं उसके लिए बेहतर फिट की तरह दिखते हैं। – mfulton26

उत्तर

5

वर्तमान में withDefault द्वारा लौटा एक रैपर संपत्ति प्रतिनिधिमंडल उपयोग मामलों में केवल उपयोग योग्य है।

val map = mutableMapOf<String, Set<String>>().withDefault { mutableSetOf() } 

var property: Set<String> by map // returns empty set by default 
1

ठीक है, getOrImplicitDefault के सभी कार्यान्वयन टी को getOrElseNullable पर रीडायरेक्ट करते हैं। शायद कोशिश करो।

+0

इस समाधान में कोई समस्या है: 'getOrElseNullable' विधि के प्रत्येक कॉल के लिए डिफ़ॉल्ट मान के साथ लैम्ब्डा निर्दिष्ट करने की आवश्यकता है। मैं इससे बचने की कोशिश करता हूं और केवल एक ही स्थान पर डिफ़ॉल्ट मान घोषित करना चाहता हूं। –

4

Kotlin 1.1 में यह वास्तव में अगर आप get() समारोह के बजाय getValue() फ़ंक्शन का उपयोग करें काम करता है की तरह लग रहा।

+1

ऐसा लगता है कि डिफ़ॉल्ट मान लौटाया गया है, लेकिन मानचित्र में नहीं रखा गया है ... बल्कि बेकार। – Guillaume

+0

जिज्ञासा से, आपको इसे मानचित्र में डालने की आवश्यकता क्यों है यदि केवल getValue() को कॉल करने से आपको फिर से मूल्य मिल जाता है? – sschuberth

+0

यदि मैप में इस कुंजी के साथ कोई मान नहीं है तो मैं प्रदान की गई कुंजी के साथ ऑब्जेक्ट बनाने का एक डिफ़ॉल्ट तरीका प्रदान करना चाहता हूं। इस प्रकार ग्रोवी में डीफॉल्ट काम करता है और मैं कोटलिन में भी यही काम करना चाहता हूं। क्योंकि मुझे init के बाद एक ही उदाहरण पुनर्प्राप्त करने की आवश्यकता है और मुझे इसे म्यूट करने की आवश्यकता है। इस बात को करने का ग्रोवी तरीका यहां है: http://mrhaki.blogspot.ch/2010/07/groovy-goodness-map-with-default-values.html – Guillaume

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