我经常需要总结Scala中数字列表的转换.当然,一种方法是:
list.map(transform(_)).sum
Run Code Online (Sandbox Code Playgroud)
但是,这不会在不需要创建内存时创建内存.另一种方法是折叠列表.
list.foldLeft(0.0) { (total, x) => total + f(x) }
Run Code Online (Sandbox Code Playgroud)
我发现第一个表达式比第二个表达式更容易编写.有没有一种我可以使用的方法,它具有第一种方便性和第二方的效率?或者我最好编写自己的隐式方法?
list.mapSum(transform(_))
Run Code Online (Sandbox Code Playgroud)
Lui*_*hys 12
您可以使用视图使您的变换器方法(映射,过滤器......)变得懒惰.有关更多信息,请参见此处
因此,例如在您调用的方法的情况下transform,您将编写
list.view.map(transform).sum
Run Code Online (Sandbox Code Playgroud)
(注意你可以选择省略(_))
调用此操作foldMap,您可以在Scalaz中找到它.
list foldMap transform
Run Code Online (Sandbox Code Playgroud)