1

我最近一直在使用 Arrow Kotlin,但我仍然对如何将选项列表映射到它们的值感到困惑。例如:

val listOfStrings: List<String> = listOf<Option<String>>().map { /* ? */ }

目前我正在这样做:

val listOfStrings: List<String> = listOf<Option<String>>().filter { it.isDefined() }.map { it.getOrElse { "" } }

但它感觉很笨重,我肯定错过了一些东西。

4

3 回答 3

3

就我个人而言,我相信 Kotlin 的可空支持能够以比箭头选项更优雅的方式处理可空,检查blogpost,说一些替代方案是:

listOf<Option<String>>().mapNotNull { it.orNull() }
listOf<Option<String>>().flatMap { it.toList() }
listOf<Option<String>>().mapNotNull { if (it is Some) it.t else null }
于 2020-01-13T16:33:30.610 回答
3

你想要 Haskell 的catMaybes. :D
我不知道 Arrow 中是否有类似的东西,但你可以使用filterMapfrom arrow.core.extensions.list.monadFilter.filterMap

fun main() {
    val list = listOf(Some(1), None)

    println(list.filterMap(::identity))
}
// prints: ListK(list=[1])
于 2020-01-13T18:02:58.917 回答
0

如果您想从中提取值,则Option需要提供默认值,以防该值不存在

在您为此使用的第二行代码getOrElse中。哪个是正确的,并且有一个签名,fun <A> Option<A>.getOrElse(f: () -> A): A这意味着它要么返回当前值,要么返回默认值,以防不存在

解决方案:您可以简单map地使用.OptionListgetOrElse

val listOfStrings: List<String> = listOf<Option<String>>().map { it.gerOrElse { "" }  }
于 2020-01-13T16:28:00.897 回答