Разница между stream.max (Comparator) и stream.collect (Collectors.maxBy (Comparator) в Java - PullRequest
0 голосов
/ 29 сентября 2018

В Java Streams - в чем разница между stream.max(Comparator) и stream.collect(Collectors.maxBy(Comparator)) с точки зрения соответствия.Оба извлекают максимум на основе переданного компаратора.Если это так, зачем нам нужен дополнительный этап сбора с использованием метода сбора?Когда мы должны выбрать первое против второго?Какие сценарии использования подходят для использования обоих?

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

В Effective Java 3-е издание, стр. 214 есть соответствующая цитата:

Коллекторы, возвращаемые методом counting, предназначены только для использования в качестве нижестоящих коллекторов.Та же самая функциональность доступна непосредственно в Stream с помощью метода count, поэтому у нет никаких оснований говорить collect(counting()).Есть еще пятнадцать Collectors с этим свойством.

Учитывая, что maxBy дублируется на Stream.max, это, вероятно, один из этих шестнадцати методов.

Вскоре после,на той же странице это оправдывает двойное существование:

С точки зрения дизайна, эти коллекторы представляют собой попытку частично дублировать функциональность потоков в коллекторах, чтобы нижестоящие коллекторы могли действовать как «минипотоки».

Лично я нахожу этот указ и объяснение немного неудовлетворительными: он говорит, что это не было намерением для этих 16 сборщиков, которые будут использоваться таким образом, но не почемуони не должны .

Я полагаю, что методы непосредственно в потоке могут быть реализованы специализированными способами, которые могут быть более эффективными, чем обычные сборщики.

0 голосов
/ 29 сентября 2018

Они делают одно и то же и используют один и тот же код.

зачем нам нужен дополнительный этап сбора с использованием метода сбора?

Вы нет.Используйте max(), если это то, что вы хотите сделать.Но есть случаи, когда коллекционер может быть полезен.Например:

Optional<Foo> result = stream.collect(createCollector());

, где createCollector() вернет коллектор на основе некоторого условия, которое может быть maxBy, minBy или что-то еще.

В общем, вам не нужно слишком сильно беспокоиться о небольших различиях в производительности, которые могут существовать между двумя методами, которые выполняют одну и ту же задачу и имеют огромные шансы быть реализованными одинаково.Вместо этого вы должны сделать свой код максимально понятным и читабельным.

...