如何在Kotlin的Map实例中使用`filter`?
我看到#filter
是在Map
上定义的,但我无法弄清楚如何使用它。 任何人都在意分享一个例子?
我有一个深层嵌套的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
看起来像你所需要的是符合你的标准的第一个条目的关键部分。 像这样的东西(单线故意)应该有所帮助:
val currentIndexName = indexToAliasMappings.filterValues { it["aliases"]?.containsKey(alias) ?: false }.keys.firstOrNull() ?: ""
.filter
的lambda为地图中的每个条目返回一个布尔值。 如果该布尔值为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
你不能在地图本身上调用firstOrNull
,但你可以在其entries
集上调用它:
val currentIndexName = indexToAliasMappings.entries.firstOrNull { it.value["aliases"]?.containsKey(alias) == true }?.key
firstOrNull
遍历映射条目,并停止匹配谓词的第一个条目。 这里不需要像filter
或filterValues
的变体那样的中间映射分配。