我最近一直在使用 kotlin arrow,但我遇到了一个让我陷入困境的特定用例。
假设我有一些对象的集合,我想使用转换函数将其转换为另一种数据类型。还可以说这个转换函数有失败的能力——但不是抛出异常,它只会返回一个 Either,其中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()
包含所有映射的对象。
有什么想法可以以干净的方式做到这一点吗?理想情况下,我想进行一系列函数调用,但能够通过函数调用将错误向上渗透。