Если вы просто хотите узнать, как лучше использовать преимущества параллелизма, вы можете сделать что-то вроде:
ConcurrentMap<Integer, List<Integer>> map = IntStream.range(0, Integer.MAX_VALUE)
.parallel()
.filter(i -> i % 2 == 0)
.boxed()
.collect(Collectors.groupingByConcurrent(
i -> i / 3,
Collectors.mapping(i -> i, Collectors.toList())));
Промежуточное создание пар не требуется, и groupingByConcurrent
параллельно накапливается в новой ConcurrentMap.
Имейте в виду, что с параллельным потоком вы застряли с общим ForkJoinPool
. Для распараллеливания предпочтительнее использовать что-то более гибкое, например ExecutorService
вместо Java Streams.