将选项列表映射到字符串列表

Map list of Options to list of Strings

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

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

目前我是这样做的:

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

但感觉很笨拙,我肯定漏掉了什么。

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

在第二行代码中,您为此使用了 getOrElse。这是正确的并且具有 fun <A> Option<A>.getOrElse(f: () -> A): A 的签名,这意味着它要么是 returns 存在 值,要么是 不存在时的默认值 .

解决方法: 您可以简单地 map List 中的每个 Option 使用 getOrElse.

的值
val listOfStrings: List<String> = listOf<Option<String>>().map { it.gerOrElse { "" }  }

我个人认为 Kotlin 的 nullable 支持能够比箭头选项更优雅地处理 nullable,检查 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 }

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

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

    println(list.filterMap(::identity))
}
// prints: ListK(list=[1])