假设Scala中的以下简单代码计算总和
var sum = 0
for (xs <- xss; x <- xs) sum +=x
以这种方式计算总和有副作用。如何在没有副作用的情况下这样做?
答案 0 :(得分:1)
假设您的xss
为List of List
,
scala> val collection = List(List(1, 2, 3, 4), List(5, 6, 7, 8))
collection: List[List[Int]] = List(List(1, 2, 3, 4), List(5, 6, 7, 8))
scala> var sum = 0
sum: Int = 0
scala> for (xs <- collection; x <- xs) sum +=x
scala> sum
res4: Int = 36
更短的方法是展平你的收藏并总结元素
scala> collection.flatten.sum
res7: Int = 36
另外,您可以按照自己的方式折叠整个系列。
scala> collection.flatten.foldLeft(0)((a, b) => a + b)
res9: Int = 36
// or without flattening
scala> collection.foldLeft(0)((a, b) => a + b.sum)
res14: Int = 36
或可能有reducedLeft
,
scala> collection.flatten.reduceLeft((a, b) => a + b)
res10: Int = 36
但是自收集.sum
以来,您应该使用.sum
。