You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 19:15:00