如何在Kotlin中有效地压平"非此即彼"列表



我有一个类似于List<Either<Failure, List<MyResult>>>的列表,我想使用Arrow kt将其展平为Either<Failure, List<MyResult>>,但我尝试的所有操作似乎都很笨拙,最终遍历了列表两次。感觉应该有更好的方法,但我想不通。下面是我现在拥有的一个人为的例子:

val things : List<MyThing> = /* some stuff */
val results : List<Either<Failure, List<MyResult>>> = things.map { doThingThatReturnsEither(it) }
val successes : List<MyResult> = results.mapNotNull { it.orNull() }.flatten()
val firstFailure : Failure? = results.mapNotNull { it.swap().orNull() }.firstOrNull()
return firstFailure?.let {it.left()} ?: success.right() 

欢迎提出任何建议!

额外的问题:如果其中一个带着Left回来,有没有办法缩短things.map { }

您要查找的函数是sequence

val res:Either<Failure, List<MyResult>> = results.sequence(Either.applicative())
.fix()
.map { it.fix() }

这将使第一个Failure(如果有(短路,并将其返回为左侧,或者将所有MyResult作为列表提供给您。

需要CCD_ 8和CCD_。

相关内容

  • 没有找到相关文章

最新更新