如何解决Kotlin reduce 有局限性吗?
我想使用reduce方法实现以下相同的代码。我知道这在其他语言中是可能的,但我不知道如何在 Kotlin 中实现它
class A
class B (val a: A?)
fun test(listofBs: List<B>): List<A> {
return listofBs.filter { it.a != null }.map { it.a!! }
// Todo return listofBs.reduce { ??? }
}
解决方法
您可以使用 mapNotNull
from the Kotlin Standard Library,而不是先调用 filter
,然后再调用 map
。这个函数结合了两者,你可以避免Hold My Beer operator(!!
)。
示例:
fun test(listOfBs: List<B>): List<A> =
listOfBs.mapNotNull { it.a }
,
Kotlin 中的 reduce
不适合这个。声明如下:
inline fun <S,T : S> Iterable<T>.reduce(
operation: (acc: S,T) -> S
): S
注意它如何只能返回一个 S
,它是元素类型 T
的超类型。这意味着您不能将 reduce
List<B>
转换为 List<A>
。
在“其他语言”中,您可以在减少时指定“身份元素”,您可能也想这样做。在 Kotlin 中,您可以使用 fold
:
fun test(listOfBs: List<B>): List<A> =
listOfBs.fold(emptyList()) { acc,b ->
if (b.a != null) {
acc + listOf(b.a) // this is very bad code,it creates a bunch of unnecessary lists
} else {
acc
}
}
当然,“仅在非空时才映射”是很常见的事情,它已经内置到 Kotlin 标准库中 - mapNotNull
:
fun test(listOfBs: List<B>): List<A> =
listOfBs.mapNotNull { it.a }
,
您可以看看 reduce
在 Kotlin 标准库中是如何实现的:
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/reduce.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。