我经常需要对Scala中的数字列表进行转换。当然,一种方法是:
list.map(transform(_)).sum
但是,这不会在不需要创建内存时创建内存。另一种方法是折叠列表。
list.foldLeft(0.0) { (total, x) => total + f(x) }
我发现第一个表达式比第二个表达式更容易编写。有没有一种我可以使用的方法,它具有第一种方便性和第二方的效率?或者我最好编写自己的隐式方法?
list.mapSum(transform(_))
答案 0 :(得分:12)
您可以使用视图使变换器方法(map,filter ...)变得懒惰。有关详细信息,请参阅here。
因此,例如,在您使用名为transform
的方法的情况下,您将编写
list.view.map(transform).sum
(请注意,您可以选择省略(_)
)
答案 1 :(得分:5)
此操作称为foldMap
,您可以在Scalaz中找到它。
list foldMap transform