我的问题在某种程度上与Kotlin arrow kt Flatten nested Eather有关,但也不完全相关。
我有一个映射通过的列表,在这个映射中我调用一个函数,该函数返回一个"要么"。如果非此即彼包含错误,我需要立即退出。
我现在有这样的东西:
fun doSomethingWithUsers(userList: List<User>): Either<SomethingBadException, List<User>> =
userList
.map {
if (!isAlreadyProcessed(it)) {
processUser(it.userId).fold(
ifLeft = {
somethingBadException -> return@doSomethingWithUsers Either.Left(somethingBadException)
},
ifRight = { processedUser ->
User.createUser(processedUser)
}
)
} else it
}.let { Either.Right(it) }
有return@
的替代品吗?有没有更好更地道的方法来做这件事?
我目前使用的是arrow kt的v0.8.2,但我可能可以更新到1.0.1
谢谢。
您可以使用traverseEither
来实现这一点。
fun processUser(user: User): Either<Error, User> = TODO()
val list: List<User> = TODO()
list.traverseEither { processUser(it) } // Either<Error, List<User>>
对于较旧的箭头版本,请尝试:
list.traverse(Either.applicative(), { processUser(it) }).fix()