Это называется фолдом. Это почти точно то, что вы заявили:
docs.foldLeft(0)((accum, element) => accum + element.length)
для версии, которая пересекает коллекцию слева направо (обычно предпочтительнее; справа налево - foldRight
, а 2.9 имеет fold
, который может начинаться где угодно, но имеет ограничения на то, как он может преобразовывать тип).
Как только вы привыкнете к этому, появляется сокращенная версия сгиба влево, где аккумулятор перемещается влево (представьте себе, что он проталкивается слева направо по списку), и вы используете заполнители для переменной имена, так как вы используете их только один раз каждый: (0 /: docs)(_ + _.length)