В Effective Java 3-е издание, стр. 214 есть соответствующая цитата:
Коллекторы, возвращаемые методом counting
, предназначены только для использования в качестве нижестоящих коллекторов.Та же самая функциональность доступна непосредственно в Stream
с помощью метода count
, поэтому у нет никаких оснований говорить collect(counting())
.Есть еще пятнадцать Collectors
с этим свойством.
Учитывая, что maxBy
дублируется на Stream.max
, это, вероятно, один из этих шестнадцати методов.
Вскоре после,на той же странице это оправдывает двойное существование:
С точки зрения дизайна, эти коллекторы представляют собой попытку частично дублировать функциональность потоков в коллекторах, чтобы нижестоящие коллекторы могли действовать как «минипотоки».
Лично я нахожу этот указ и объяснение немного неудовлетворительными: он говорит, что это не было намерением для этих 16 сборщиков, которые будут использоваться таким образом, но не почемуони не должны .
Я полагаю, что методы непосредственно в потоке могут быть реализованы специализированными способами, которые могут быть более эффективными, чем обычные сборщики.