我已经使用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
,您必须收集它,此时它应该是一个列表。