如何在Kotlin的Map实例上使用`filter`?

arn*_*nab 7 java functional-programming gson kotlin

我看到在#filter上定义了它Map,但是我不知道如何使用它。有人愿意分享一个例子吗?

我有一个深度嵌套的TreeMap实例(TreeMap<String, Map<String, Map<*, *>>>),我想要filter/find第一个(这是该域中唯一的)顶级键,该键具有某些与值更深的内容相关的特征。

数据如下所示:

{
  "i1": {
    "aliases": {}
  },
  "i2": {
    "aliases": {}
  },
  "i3": {
    "aliases": {}
  },
  "i4": {
    "aliases": {
      "alias-im-looking-for": {}
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我有以下以下非功能性代码可立即解决该问题:

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
Run Code Online (Sandbox Code Playgroud)

Kin*_*dio 5

看起来您需要的是符合您的条件的第一个条目的关键部分。这样的事情(单行故意)应该会有所帮助:

val currentIndexName = indexToAliasMappings.filterValues { it["aliases"]?.containsKey(alias) ?: false }.keys.firstOrNull() ?: ""
Run Code Online (Sandbox Code Playgroud)


Ily*_*lya 5

你不能firstOrNull在地图上调用它,但你可以在它的entries集合上调用它:

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

firstOrNull遍历映射条目并在与谓词匹配的第一个条目上停止。此处不需要像带有filter或的变体那样进行中间映射分配filterValues