我将给出一个简化的代码来轻松解释我的问题:
- 我有一个用户余额,即
val balance = 10
- 我有一个数据列表,可以使用
for(elem <- dataList) yield (interest(elem, balance))
进行迭代。- 在我的例子中,利息是一种方法,它将对给定的参数执行计算并返回一个数字,该数字将是:提供的余额+计算的利息。
如何将这个新返回的值用于yield中数据列表中的下一个元素,以便我可以保持列表中下一个元素的最新余额?
即 for(elem <- dataList) yield (interest(elem, newBalanceFromPreviousYield))
从这个问题中我不太确定您想在最后得到什么结果:只是最终余额或每个元素的余额列表?假设后者(因为这是应用于列表的for/yield的结果类型(,scan
操作是您需要的:
dataList.scanLeft(10)((acc, currentElem) => interest(currentElem, acc)).tail
我认为
,仅将其与yield
一起使用没有简单的方法。您的用例会提醒折叠模式,因此,让我们使用它。我们积累余额并将其用于interest()
调用:
dataList.foldLeft(List.empty[Int]) { (acc, elem) =>
acc match {
case Nil =>
// if no balances accumulated yet, use default balance = 10
List(interest(elem, balance))
case all@newBalance :: _ =>
// else use accumulated balance
interest(elem, newBalance) :: all
}
}.reverse // we need to reverse result list due to :: usage