6

也许是一个愚蠢的问题,但我就是不明白。

我有一个Set<Either<Failure, Success>>并且想Set<Success>用 Arrow-kt 输出一个。

4

1 回答 1

8

您可以像这样映射集合:

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>>.filterSomeIterable<Either<A, B>.mapAsOptions功能。

更新 2:

最后一个示例返回一个Set<Option<Success>>. 如果您想在不使用的情况下展开结果,null那么您可以尝试的一件事是折叠Set

val successes = originalSet
  .fold(emptySet<Success>()) { acc, item -> 
    item.fold({ acc }, { acc + it })
  }

最后一个选项(无意的双关语)不需要使用Option.

于 2019-03-13T17:07:54.070 回答