我有一个输入值列表
List[A]
和一个函数
f(List[A]): Either[Failure, Success]
我将该函数应用于列表的每个元素,生成一个List[Either[Failure, Success]]
.
我想检查列表,如果任何值失败,则返回第一个失败,否则返回成功列表。
我使用了以下模式:
val allValues = list.map(f(_))
if (allValues.exists(_.isLeft)) {
allValues.find(_.isLeft).get
} else {
allValues.collect {
case Right(result) => result
}
}
和
val allValues = list.map(f(_))
val failures = allValues.collect { case Left(error) => error }
if (failures.nonEmpty) {
failures(0)
} else {
allValues.collect {
case Right(result) => result
}
}
有没有更简洁的方式来表达这种模式?
有时,我必须通过另一个函数进一步处理成功,再次使用相同的模式。例如
- 将 JSON 数组转换为 Scala 模型,如果任何 JSON 对象格式错误,则会失败。
- 将模型写入数据库并在任何数据库更新失败时失败。