yield - 使用先前存储在列表 [Scala] 中的元素
yield - using element stored previously in list [Scala]
我会给出一个简化的代码来轻松解释我的问题:
- 我有一个用户余额,即
val balance = 10
- 我有一个要使用
for(elem <- dataList) yield (interest(elem, balance))
迭代的数据列表。
- 在我的例子中,利息是一种方法,它将对给定的参数执行计算,return 一个数字将是:提供的余额+计算的利息。
如何在 yield 中为我的数据列表中的下一个元素使用这个新的 returned 值,以便我可以为列表中的下一个元素保持最新的余额?
即for(elem <- dataList) yield (interest(elem, newBalanceFromPreviousYield))
我想,没有什么简单的方法可以只用 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
我不太确定你最后想得到什么结果的问题:只是最终余额还是每个元素的余额列表?假设后一个(因为这是 for/yield 应用于列表的结果类型),scan
操作是你需要的:
dataList.scanLeft(10)((acc, currentElem) => interest(currentElem, acc)).tail
我会给出一个简化的代码来轻松解释我的问题:
- 我有一个用户余额,即
val balance = 10
- 我有一个要使用
for(elem <- dataList) yield (interest(elem, balance))
迭代的数据列表。- 在我的例子中,利息是一种方法,它将对给定的参数执行计算,return 一个数字将是:提供的余额+计算的利息。
如何在 yield 中为我的数据列表中的下一个元素使用这个新的 returned 值,以便我可以为列表中的下一个元素保持最新的余额?
即for(elem <- dataList) yield (interest(elem, newBalanceFromPreviousYield))
我想,没有什么简单的方法可以只用 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
我不太确定你最后想得到什么结果的问题:只是最终余额还是每个元素的余额列表?假设后一个(因为这是 for/yield 应用于列表的结果类型),scan
操作是你需要的:
dataList.scanLeft(10)((acc, currentElem) => interest(currentElem, acc)).tail