2016-11-10 79 views
3

我看到#filterMap上定義,但我無法弄清楚如何使用它。任何人都在意分享一個例子嗎?如何在Kotlin的Map實例中使用`filter`?

我有了一個更深刻嵌套TreeMap實例(TreeMap<String, Map<String, Map<*, *>>>),我想filter/find第一(這是唯一的域)擁有的東西在價值更深相關的某些特性的頂級鍵。

這裏的數據看起來的樣子:

{ 
    "i1": { 
    "aliases": {} 
    }, 
    "i2": { 
    "aliases": {} 
    }, 
    "i3": { 
    "aliases": {} 
    }, 
    "i4": { 
    "aliases": { 
     "alias-im-looking-for": {} 
    } 
    } 
} 

我已經解決了它,現在這個以下非功能代碼:

val indexToAliasMappingType = LinkedTreeMap<String, Map<String, Map<*, *>>>() 
val indexToAliasMappings = Gson().fromJson(response.jsonString, indexToAliasMappingType.javaClass) 

var currentIndexName = "" 
for ((index, aliasMappings) in indexToAliasMappings) { 
    val hasCurrentAlias = aliasMappings.get("aliases")?.containsKey(alias) 
    if (hasCurrentAlias != null && hasCurrentAlias) { 
     currentIndexName = index 
    } 
} 

return currentIndexName 

回答

2

看起來你需要的是符合條件的第一個條目的關鍵部分。像這樣的(單線故意的)東西應該幫助:

val currentIndexName = indexToAliasMappings.filterValues { it["aliases"]?.containsKey(alias) ?: false }.keys.firstOrNull() ?: "" 
1

.filter的拉姆達返回一個布爾值在每個條目地圖。如果該布爾值評估爲true,則該條目是返回集合的一部分。如果該布爾值評估爲false,則該條目被過濾掉。

val indexToAliasMapping = linkedMapOf(
    "i1" to mapOf(
     "aliases" to mapOf<Any, Any>() 
    ), 
    "i2" to mapOf(
     "aliases" to mapOf<Any, Any>() 
    ), 
    "i3" to mapOf(
     "aliases" to mapOf<Any, Any>() 
    ), 
    "i4" to mapOf(
     "aliases" to mapOf(
      "aliases-im-looking-for" to "my-alias" 
     ) 
    ) 
) 
// If you only need one, you could also use .first instead of .filter, which 
// will give you a Pair<String, Map<String, Map<*, *>>> instead of a List 
val allWithNonEmptyAliases: Map<String, Map<String, Map<*, *>>> = indexToAliasMapping.filter { 
    it.value["aliases"]?.containsKey(alias) ?: false 
} 

// We use .toList() so you can get the first element (Map doesn't allow you to retrieve by index) 
return allWithNonEmptyAliases.toList().first().first 
1

你不能在地圖上顯示調用firstOrNull,但你可以調用它的entries集:

val currentIndexName = indexToAliasMappings.entries.firstOrNull { 
    it.value["aliases"]?.containsKey(alias) == true 
}?.key 

firstOrNull遍歷映射項和停在匹配謂詞的第一個條目上。這裏不需要中間映射分配,如filterfilterValues所示。

相關問題