Вопросы про Collector.Characteristics

  1. Как IDENTITY_FINISH может ускороить работу коллектора? Я так понял, это сэкономит пару вызовов стэка (в случае с finisher который возвращает тот же supplier), a учитывая как долго может работать коллектор в зависимости от размера стрима, так это вообще ничего.
  2. Для чего CONCURRENT может использоваться, ведь combiner в любом случае вызывается при использовании parallelStream(), не зависимо от того, создан ли коллектор с параметром CONCURRENT или нет.
  3. Как CONCURRENT влияет на обычный stream()?
  4. Для чего нужен UNORDERED, если при использовании parallelStream() все в любом случае будет не сортировано, а при использовании stream() все будет обрабатываться в том же порядке в котором передали. Или я не правильно понимаю?

Ответы (1 шт):

Автор решения: Ramiz
  1. совершенно верно, IDENTITY_FINISH никак не ускорит работу коллектора, он просто показывает, что коллектор не нуждается в финальной трансформации (finisher).
  2. CONCURRENT (согласно описанию) это характеристика accumulator, а не combiner, а именно говорит о том, что accumulator можно вызывать из разных потоков(Thread).
  3. Collector.Characteristics - это характеристики коллектора, а не стрима (Stream; приходится использовать такой англицизм во избежании путаницы, т.к. "поток" скорее ассоциируется с Thread). Т.о. обычный стрим тоже может быть собран параллельно, см. Collectors.groupingByConcurrent() Collectors.toConcurrentMap()
  4. UNORDERED - говорит о том что коллектор не соблюдает порядок элементов, например собирает их в Set. Наличие этой характеристики является одним из требований позволяющих параллельную сборку. см Collector

A concurrent reduction should only be applied if the collector has the Collector.Characteristics.UNORDERED characteristics or if the originating data is unordered

→ Ссылка