如何展平 Arrow-KT 的 要么 和 Kotlin 协程的流



我已经使用Arrow-KT很长时间了。我对协程和它们周围的编程模型比较陌生,这是我第一个使用它们的项目。我有以下场景:

Either.catch { funcThatReturnsFlow() }
.map { flow ->
flow.map { flowItem -> mappingFuncThatReturnsEither(flowItem) }
}
// Type is now Either<Throwable, Flow<Either<Throwable, Item>>>
正如你从上面的例子中看到的,我是第一次使用流。我想处理返回流的函数的异常,所以我把它包装在Either.catch中。然后,我想用一个也返回Either的函数映射流中的每个项目。结果我现在有Either<Throwable, Flow<Either<Throwable, Item>>>的输出。

我可以用下面的代码折叠它:

resultFromBefore.flatMap { flow -> flow.toList().sequence() }
// Type is now Either<Throwable, List<Item>>

这样做的问题是它使Flow通过一个收集过程来产生一个正常的List。我正在使用的数据集非常小,所以这样做是微不足道的,但我的目标之一是更好地使用协程。

所以,我想知道是否有任何等效形式的sequence()流类型?可以将Either<Throwable, Flow<Either<Throwable, Item>>>转换为Either<Throwable, Flow<Item>>

这是不可能的。Flow是一个配方,用于获取值流。为了确定Flow中是否有Throwable,您必须收集它,此时它应该是一个列表。

最新更新