карта потока с Collectors.toMap против Аккумулятора - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть набор перечислений Set<Task> tasks; и обработка этого в EnumMap:

Версия 1 (с использованием поставщика, аккумулятора, объединителя):

return task.stream()
           .collect(() -> new EnumMap<>(Task.class),
                        (map, item) -> map.put(item, compute(item)), 
                        Map::putAll);

Версия 2 (с использованием Collectors.toMap):

return tasks.stream().collect(
       Collectors.toMap(
              Function.identity(), 
              t -> compute(t), 
              null, 
              () -> new EnumMap<>(Task.class)));

Мне нравится версия 1 , потому что она короче. Тем не менее, я должен выбрать самая быстрая версия . Будет ли версия 1 работать с parallelStream? В отличие от версии 2 , в которой используется Collectors.toMap, имеется следующее API-примечание:

Impl Примечание: Для параллельных потоковых конвейеров функция объединения работает путем объединения ключи от одной карты в другую, что может быть дорогостоящей операцией.

3 Вопросы:

  1. Это также происходит с версия 1?

  2. Какой из них выбрать для быстрой и точной обработки?

  3. И есть ли способ устранить необходимость его материализации в EnumMap? Я думал о том, чтобы вернуть только key-value-stream , но это кажется невозможным с stream.map(..).

...