有没有更好的方法:
val totalScore = set.foldLeft(0)( _ + score(_) )
Run Code Online (Sandbox Code Playgroud)
或这个:
val totalScore = set.toSeq.map(score(_)).sum
Run Code Online (Sandbox Code Playgroud)
我认为这是一个非常常见的操作,所以期待更时尚的东西:
val totalScore = set.sum( score(_) )
Run Code Online (Sandbox Code Playgroud)
Dan*_*ral 17
那么,还有其他方法可以编写它:
val totalScore = set.toSeq.map(score(_)).sum
val totalScore = set.toSeq.map(score).sum
val totalScore = set.toSeq map score sum
Run Code Online (Sandbox Code Playgroud)
如果下一行不以关键字开头,则最后一行可能需要在结尾处使用分号.也可以使用.view代替.toSeq,这将避免分配临时集合.但是,我不确定.view现在的行为(显示重复元素)是否正确.
Seq.sum没有采用可用于对总和进行评分的函数.你可以定义一个"pimps"的隐式转换Traversable:
implicit def traversableWithSum[A](t: Traversable[A])(implicit m: Numeric[A]) = new {
def sumWith(f: A => A) = t.foldLeft(m.zero)((a, b) => m.plus(a, f(b)))
}
def score(i: Int) = i + 1
val s = Set(1, 2, 3)
val totalScore = s.sumWith(score _)
println(totalScore)
=> 9
Run Code Online (Sandbox Code Playgroud)
请注意,该Numeric特征仅存在于Scala 2.8中.