gpt4 book ai didi

Kotlin 智能转换一对带过滤器的第二个值

转载 作者:行者123 更新时间:2023-12-04 23:41:24 25 4
gpt4 key购买 nike

我正在尝试编写一个映射 String 和 Int 的函数?成对,然后在继续映射之前过滤该对中的非空第二个值。

我的代码如下所示:

val ids: List<String> = listOf("a", "b", "c")
val ints: Map<String, Int?> = mapOf("a" to 1, "b" to 2, "c" to null)

ids.map { id: String ->
Pair(id, ints[id])
}.filter { pair -> pair.second != null}.map { pair: Pair<String, Int> ->
func(id, pair.second)
}

问题是第二张 map 有错误:
Type inference failed: Cannot infer type parameter T in 
inline fun <T, R> kotlin.collections.Iterable<T>.map ( transform (T) -> R ): kotlin.collections.List<R>

这看起来是因为编译器不知道智能转换我的 Iterable<Pair<String, Int?>>Iterable<Pair<String, Int>>在我的 filter 之后.我该怎么做才能解决这个问题?

最佳答案

Kotlin 的智能转换通常不适用于方法边界之外。但是,无论如何,有几种方法可以实现您的目标。

首先,您可以使用 !! 简单地告诉编译器该对的第二个值永远不会为空。像这样的运营商:

ids.map { id: String -> Pair(id, ints[id]) }
.filter { pair -> pair.second != null }
.map { pair: Pair<String, Int?> -> func(pair.second!!) }

其次,可以颠倒 filter的顺序和 map并申请 !!之前的运营商:
ids.filter { id: String -> ints[id] != null }
.map { id: String -> id to ints[id]!! } //equivalent to Pair(id, ints[id]!!)
.map { pair: Pair<String, Int> -> func(pair.second) }

最后,您可以在没有 !! 的情况下使其工作运算符通过使用 mapNotNull 在一步中组合过滤和映射扩展方法:
ids.mapNotNull { id: String -> ints[id]?.let { id to it } }
.map { pair: Pair<String, Int> -> func(pair.second) }

关于Kotlin 智能转换一对带过滤器的第二个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36567826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com