Как суммировать поля элементов коллекции без их предварительного сопоставления (например, foldLeft / reduceLeft)?

Рассмотрим этот класс:

 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 , мне нужно сначала сопоставить значение, и код будет выглядеть следующим образом:

persons.map(_.age).sum

Как можно Я использую метод sum без создания некоторой промежуточной коллекции?

(Я знаю, что такая «оптимизация», скорее всего, не имеет реальной разницы в производительности, если она не выполняется в плотный цикл, и я также знаю о ленивых просмотрах и т. д.)

Возможно ли, чтобы код вроде

persons.sum(_.age)

выполнял то же самое, что и foldLeft / reduceLeft ?

14
задан soc 21 February 2011 в 09:45
поделиться