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

时间:2017-11-19 15:04:07

标签: scala recursion element yield

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

  • 我有一个用户余额,即val balance = 10
  • 我有一个使用for(elem <- dataList) yield (interest(elem, balance))进行迭代的数据列表。
    • 在我的情况下,兴趣是一种方法,它将对给定的参数执行计算并返回一个数字,该数字将是:提供的余额+计算的利息

如何将这个新返回的值用于我的数据列表中的下一个元素的yield,这样我可以保持列表中下一个元素的最新余额?

即。 for(elem <- dataList) yield (interest(elem, newBalanceFromPreviousYield))

2 个答案:

答案 0 :(得分:1)

我不确定这个问题你最终会得到什么结果:只是每个元素的最终余额或余额清单?假设后一个(因为这是for / yield应用于列表的结果类型),scan操作就是你需要的:

dataList.scanLeft(10)((acc, currentElem) => interest(currentElem, acc)).tail

答案 1 :(得分:0)

我认为,只有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