【发布时间】:2010-11-26 03:31:29
【问题描述】:
我对 Scala 还很陌生,但我想知道解决这个问题的首选方法是什么。假设我有一个项目清单,我想知道支票项目的总金额。我可以这样做:
val total = items.filter(_.itemType == CHECK).map(._amount).sum
这将给我我需要的东西,一个不可变变量中所有检查的总和。但它看起来像是 3 次迭代。一次过滤支票,再次映射金额,然后是总和。另一种方法是执行以下操作:
var total = new BigDecimal(0)
for (
item <- items
if item.itemType == CHECK
) total += item.amount
这给了我相同的结果,但有 1 次迭代和一个看起来也不错的可变变量。但是如果我想提取更多信息,比如检查的总数,那将需要更多的计数器或可变变量,但我不必再次遍历列表。似乎不是实现我需要的“功能”方式。
var numOfChecks = 0
var total = new BigDecimal(0)
items.foreach { item =>
if (item.itemType == CHECK) {
numOfChecks += 1
total += item.amount
}
}
因此,如果您发现自己需要在列表中包含一堆计数器或总计,是保留可变变量还是不用担心它,请按照以下方式进行操作:
val checks = items.filter(_.itemType == CHECK)
val total = checks.map(_.amount).sum
return (checks.size, total)
这似乎更容易阅读并且只使用vals
【问题讨论】:
-
for表达式实际上编译为map、filter和foreach,所以它相当于你的第一个示例。 -
这不再准确:for comprehension 使用 withFilter,而不是 filter,除非集合没有 withFilter 方法。
标签: scala