【发布时间】:2019-03-13 11:02:36
【问题描述】:
也许是个愚蠢的问题,但我就是不明白。
我有一个Set<Either<Failure, Success>>,想用 Arrow-kt 输出一个Set<Success>。
【问题讨论】:
也许是个愚蠢的问题,但我就是不明白。
我有一个Set<Either<Failure, Success>>,想用 Arrow-kt 输出一个Set<Success>。
【问题讨论】:
你可以像这样对集合进行映射:
val successes = originalSet.mapNotNull { it.orNull() }.toSet()
或者如果你想要左边:
val failures = originalSet.mapNotNull { it.swap().orNull() }.toSet()
如果您想将最后的toSet() 保留为Set,则它是可选的,因为mapNotNull 是Iterable 上的扩展函数,并且始终返回List
PS:没有愚蠢的问题:)
更新:
可以避开nullables:
val successes = originalSet
.map { it.toOption() }
.filter { it is Some }
.toSet()
我们可能会添加Iterable<Option<A>>.filterSome 和Iterable<Either<A, B>.mapAsOptions 函数。
更新 2:
最后一个示例返回Set<Option<Success>>。如果您想在不使用null 的情况下展开结果,那么您可以尝试的一件事是折叠Set:
val successes = originalSet
.fold(emptySet<Success>()) { acc, item ->
item.fold({ acc }, { acc + it })
}
最后一个选项(无意的双关语)不需要使用Option。
【讨论】:
filter 函数,它是map().filterNotNull() 的缩写。类似于 flatMap() 是 map().flatten() 的缩写(我想这很奇怪,因为名称的顺序发生了变化)
null 但这迫使我这样做,至少在一个狭窄的范围内。
null的示例