yield - 使用以前存储在列表 [Scala] 中的元素



我将给出一个简化的代码来轻松解释我的问题:

  • 我有一个用户余额,即 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

最新更新