Scala vals 与 vars

标签 scala

我对 Scala 很陌生,但我想知道解决这个问题的首选方法是什么。假设我有一个元素 list ,我想知道支票元素的总数。我可以这样做:

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

最佳答案

在一次迭代中解决问题的另一种方法是使用 View 或迭代器:

items.iterator.filter(_.itemType == CHECK).map(._amount).sum

或者
items.view.filter(_.itemType == CHECK).map(._amount).sum

这样表达式的求值被延迟到 sum 的调用。 .

如果您的项目是案例类,您也可以这样编写:
items.iterator collect { case Item(amount, CHECK) => amount } sum

关于Scala vals 与 vars,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4269489/

相关文章:

mysql - 使用 SQL 插值的 ScalikeJDBC 出现未知 SQL 语法错误

scala - 如何使用! scala 中的运算符?

scala - 使用 Circe 解码 Normal Class(不是 case class)

java - 在 Mac OSX 上从 GitHub 编译 Scala 项目 - 加载 : net. java.games.input.OSXEnvironmentPlugin

java - 无法启动 Java 客户端 1.5.0 NoSuchMethodException

performance - Scala 的理解性能

scala - 为什么 "((left union right) union other)"没有关联行为?

syntax - Scala "magic"函数列表

scala - 将 Actor 状态变量声明为可变变量

Scala 泛型 - 当使用类型约束时,为什么 scala 返回父类(super class)型而不是子类型的实例?