У меня есть набор перечислений 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?
Какой из них выбрать для быстрой и точной обработки?
И есть ли способ устранить необходимость его материализации в EnumMap
? Я думал о том, чтобы вернуть только key-value-stream , но это кажется невозможным с stream.map(..)
.