也许是一个愚蠢的问题,但我就是不明白。
我有一个Set<Either<Failure, Success>>
并且想Set<Success>
用 Arrow-kt 输出一个。
您可以像这样映射集合:
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
.