Я не понимаю точного варианта использования Collectors.groupingByConcurrent
.Из JavaDocs:
Возвращает параллельный Collector, реализующий каскадную операцию «group by» для элементов ввода типа T ...Это параллельный и неупорядоченный коллектор....
Возможно, здесь ключевыми словами являются каскадный "group by" .Это указывает на что-то в том, как фактическое накопление сделано коллекционером?(глядя на источник, он очень быстро запутался)
Когда я тестирую его с подделкой ConcurrentMap
class FakeConcurrentMap<K, V> extends HashMap<K, V>
implements ConcurrentMap<K, V> {}
Я вижу, что этоРазрывы (дает неправильные агрегации, так как карта не является поточно-ориентированной) с параллельными потоками:
Map<Integer, Long> counts4 = IntStream.range(0, 1000000)
.boxed()
.parallel()
.collect(
Collectors.groupingByConcurrent(i -> i % 10,
FakeConcurrentMap::new,
Collectors.counting()));
Без .parallel()
, результаты всегда корректны.Похоже, что groupingByConcurrent
идет с параллельными потоками.
Но, насколько я вижу, следующий параллельный поток, собранный с помощью groupingBy
, всегда дает правильные результаты:
Map<Integer, Long> counts3 = IntStream.range(0, 1000000)
.boxed()
.parallel()
.collect(
Collectors.groupingBy(i -> i % 10,
HashMap::new,
Collectors.counting()));
Так, когда правильно использовать groupingByConcurrent
вместо groupingBy
(конечно, это не может быть просто для получения группировок в качестве параллельной карты)?