如何在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遍历映射条目,并停止匹配谓词的第一个条目。 这里不需要像filterfilterValues的变体那样的中间映射分配。