如何在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 

3 Solutions collect form web for “如何在Kotlin的Map实例中使用`filter`?”

看起来像你所需要的是符合你的标准的第一个条目的关键部分。 像这样的东西(单线故意)应该有所帮助:

 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的变体那样的中间映射分配。

  • Kotlin:方法不能和泛型一起使用
  • 在Android Java / Kotlin中,是否实现了一个接口直接访问嵌套类的本地变量
  • 生成错误:错误:执行任务':app:compileLightningLiteDebugKotlin'失败。 >编译错误
  • 用rxJava和Retrofit重复请求登录表单
  • Vert.x使用BLOB和休眠区分数据库中的数据
  • Kotlin从2个数组中过滤最大值的方法?
  • 在IntelliJ的Kotlin> Java转换之后,将源代码恢复为Java
  • IDEA在树中显示一个项目两次
  • 意图在Android的webview中播放任何嵌入的视频
  • Dagger 2不会生成组件类(Android,Kotlin)
  • 我如何使用视图模型,用sqlite和广播接收器来更新UI?
  • Kotlin language will be the best programming language for Android.