2016-04-25 42 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作爲默認值的回調)。

似乎這種功能在Kotlin中沒有正確實現,或者我錯誤地使用了它。那麼,如何正確使用withDefault包裝?

+0

番石榴的['SetMultimap'](http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/SetMultimap.html)或['LoadingCache'](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的所有實現都會將t重定向到getOrElseNullable。也許嘗試一下。

+0

該解決方案存在一個問題:需要爲每個調用'getOrElseNullable'方法指定具有默認值的lambda。我儘量避免這種情況,只想在一個地方聲明默認值。 –

4

貌似在科特林1.1如果您使用getValue()功能,而不是get()函數的本次實際工作。

+1

看起來像是返回了默認值,但沒有放入地圖......而是沒用。 – Guillaume

+0

出於好奇,如果只是調用getValue()再次獲得值,您爲什麼需要將它放入地圖? – sschuberth

+0

我想提供一個默認的方式來創建一個對象與提供的鍵,如果地圖不包含任何值與此鍵。這就是withDefault在Groovy中的工作原理,我想在Kotlin中做同樣的事情。因爲我需要在init之後檢索同一個實例,所以我需要對它進行變異。 下面是Groovy做這件事的方法:http://mrhaki.blogspot.ch/2010/07/groovy-goodness-map-with-default-values.html – Guillaume