最近我一直在使用kotlin箭头,我遇到了一个特定的用例,这让我陷入了困境。
假设我有一个对象的集合,我希望使用一个转换函数将其转换为另一个数据类型。我们还假设这个转换函数有失败的能力--但是它不会抛出异常,它只返回一个“任”,其中Either.Left()是一个失败,而Either.Right()是映射的对象。处理这个用例的最好方法是什么?下面是一些示例代码:
val list: Collection<Object> // some collection
val eithers: List<Either<ConvertError, NewObject>> = list.map { convert(it) } // through some logic, convert each object in the collection
val desired: Either<ConvertError, Collection<NewObject>> = eithers.map { ??? }
fun convert(o: Object) : Either<ConvertError, NewObject> { ... }本质上,我想调用数据集合上的映射函数,如果任何映射响应失败,我希望有一个包含错误的Either.Left()。否则,我希望Either.Right()包含所有映射的对象。
有什么干净的方法吗?理想情况下,我希望创建一个函数调用链,但是能够通过函数调用过滤一个错误。
发布于 2021-02-26 22:07:22
这是一个常见的问题,您要寻找的是traverse。它类似于map,只不过它按照内容的聚合规则收集结果。
因此,list.k().traverse(Either.applicative()) { convert(it) }将返回Either.Left是任何返回Left的操作,而Right<List<则返回其他操作。
发布于 2022-02-08 10:38:40
arrow.core.IterableKt#sequenceEither怎么样?
val desired: Either<ConvertError, Collection<NewObject>> = eithers.sequenceEither()https://stackoverflow.com/questions/66392682
复制相似问题