将选项列表映射到字符串列表
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])
我最近经常使用 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])