在我的代码中,我经常需要通过对内部模型执行操作来处理列表。对于每个处理过的元素,返回模型,然后将“新”模型用于列表的下一个元素。
通常,我通过使用尾递归方法来实现这一点:
def createCar(myModel: Model, record: Record[Any]): Either[CarError, Model] = {
record match {
case c: Car =>
// Do car stuff...
val newModel: Model = myModel.createCar(record)
Right(newModel)
case _ => Left(CarError())
}
}
@tailrec
def processCars(myModel: Model, records: List[Record[Any]]): Either[CarError, Model] =
records match {
case x :: xs =>
createCar(myModel, x) match {
case Right(m) => processCars(m, xs)
case e@Left(_) => e
}
case Nil => Right(myModel)
}
由于我不断重复这种模式,我正在寻找使其更简洁和更实用的方法(即 Scala 方式)。我已经调查过foldLeft
,但无法使用Either
:
recordsList.foldLeft(myModel) { (m, r) =>
// Do car stuff...
Right(m)
}
是foldLeft
合适的替代品吗?我怎样才能让它工作?