2016-04-25 8 views
8

voglio usare MutableMapwith defaults:Come usare i wrapper predefiniti?

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

ma non posso usare getOrImplicitDefault metodo perché withDefault rendimenti MutableMap<String, Set<String>> tipo. Inoltre, non posso trasmettere l'interfaccia MutableMapWithDefault perché this is a private interface.

Non riesco a utilizzare il metodo get perché restituisce un tipo nullable. Va bene perché questo è un metodo sull'interfaccia MutableMap (inoltre non chiama il callback defaultValue per prendere il valore predefinito).

Sembra che questa funzionalità non sia correttamente implementata in Kotlin o che io la stia usando male. Quindi, come utilizzare i wrapper withDefault correttamente?

+0

['SetMultimap'] di Guava (http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/SetMultimap.html) o [' LoadingCache'] (http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/cache/LoadingCache.html) sembrano più adatti a ciò che stai cercando di realizzare. – mfulton26

risposta

5

Attualmente un wrapper restituito da withDefault è utilizzabile solo nei casi di utilizzo della delega proprietà.

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

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

Bene, tutte le implementazioni di getOrImplicitDefault reindirizzano t a getOrElseNullable. Forse provalo.

+0

Questa soluzione ha un problema: è necessario specificare lambda con valore predefinito per ogni chiamata del metodo 'getOrElseNullable'. Cerco di evitarlo e voglio dichiarare il valore di default solo in un posto. –

4

assomiglia nella Kotlin 1.1 funziona in realtà se si utilizza la funzione getValue() anziché la funzione get().

+1

Sembra che il valore predefinito sia restituito, ma non inserito nella mappa ... piuttosto inutile. – Guillaume

+0

Per curiosità, perché è necessario inserirlo nella mappa se solo richiamando getValue() si ottiene di nuovo il valore? – sschuberth

+0

Desidero fornire un modo predefinito per creare un oggetto con la chiave fornita se la mappa non contiene alcun valore con questa chiave. Questo è il modo in cui withDefault funziona in Groovy e voglio fare la stessa cosa in Kotlin. Perché ho bisogno di recuperare la stessa istanza dopo l'init e ho bisogno di mutarlo. Ecco il modo Groovy di fare questa cosa: http://mrhaki.blogspot.ch/2010/07/groovy-goodness-map-with-default-values.html – Guillaume

Problemi correlati