请看这个类:
case class Person(val firstName: String, val lastName: String, age: Int)
val persons = Person("Jane", "Doe", 42) :: Person("John", "Doe", 45) ::
Person("Joe", "Doe", 43) :: Person("Doug", "Don", 65) ::
Person("Darius", "Don", 24) :: Person("Dora", "Don", 20) ::
Person("Dane", "Dons", 29) :: Nil
为了得到所有人的年龄之和,我可以写这样的代码:
persons.foldLeft(0)(_ + _.age)
但是如果我想使用sum
,我需要先Map值,代码如下所示:
persons.map(_.age).sum
如何使用sum
方法 * 而不 * 创建一些中间集合?
(我知道这样的“优化”在不以紧密循环运行时很可能不会有任何真实的的性能差异,我还知道惰性视图等等。)
有没有可能有这样的代码
persons.sum(_.age)
做foldLeft
/reduceLeft
做的事情?
3条答案
按热度按时间eni9jsuy1#
您的答案是您自己。只需使用
view
:要通过检查工作流程来说服自己:
对比:
aiazj4mn2#
库中的
sum
方法不能这样工作,但你可以自己编写这样的方法:您还可以添加一个隐式转换,这样您就可以像
seq.sum(f)
一样调用它,而不是mySum(f, seq)
(您可能需要一个不同于sum
的名称,以避免冲突):或者从Scala 2.10开始
qltillow3#
在Scala 3中,您可以创建以下扩展: