Arrow-kt中如何将Either<E, List<Either<E,A>>>转换为Either<E, List<B>>
需求1:所有转换成功才返回成功,任一失败返回Left
该场景使用短路逻辑,遇到第一个转换失败的项立刻返回对应Left,不会继续执行后续转换。
如果使用Arrow库的Either组件,可直接调用sequence()扩展方法实现:
import arrow.core.sequence fun getListB(): Either<Exception, List<B>> { return getListOfA().flatMap { listOfA -> listOfA.map { it.transformAtoB() }.sequence() } }
手动实现逻辑如下,无需引入第三方依赖:
fun getListB(): Either<Exception, List<B>> { return getListOfA().flatMap { listOfA -> val successList = mutableListOf<B>() for (a in listOfA) { when (val eitherB = a.transformAtoB()) { is Either.Left -> return@flatMap eitherB is Either.Right -> successList.add(eitherB.value) } } Either.Right(successList) } }
需求2:仅保留转换成功的项,忽略失败项
该场景会过滤所有转换失败的A,仅收集成功转换得到的B,仅当getListOfA()本身返回Left时才会返回Left:
fun getListB(): Either<Exception, List<B>> { return getListOfA().map { listOfA -> listOfA.mapNotNull { a -> a.transformAtoB().getOrNull() } } }
如果需要即使获取A列表失败也返回包含空列表的Right,可调整为以下实现:
fun getListB(): Either<Nothing, List<B>> { return Either.Right( getListOfA().getOrNull() ?.mapNotNull { it.transformAtoB().getOrNull() } ?: emptyList() ) }
内容的提问来源于stack exchange,提问作者macnixde
相关产品推荐
相关产品推荐

