Вопросы про Collector.Characteristics
- Как
IDENTITY_FINISHможет ускороить работу коллектора? Я так понял, это сэкономит пару вызовов стэка (в случае сfinisherкоторый возвращает тот жеsupplier), a учитывая как долго может работать коллектор в зависимости от размера стрима, так это вообще ничего. - Для чего
CONCURRENTможет использоваться, ведьcombinerв любом случае вызывается при использованииparallelStream(), не зависимо от того, создан ли коллектор с параметромCONCURRENTили нет. - Как
CONCURRENTвлияет на обычный stream()? - Для чего нужен
UNORDERED, если при использованииparallelStream()все в любом случае будет не сортировано, а при использовании stream() все будет обрабатываться в том же порядке в котором передали. Или я не правильно понимаю?
Ответы (1 шт):
Автор решения: Ramiz
→ Ссылка
- совершенно верно,
IDENTITY_FINISHникак не ускорит работу коллектора, он просто показывает, что коллектор не нуждается в финальной трансформации (finisher). CONCURRENT(согласно описанию) это характеристика accumulator, а не combiner, а именно говорит о том, что accumulator можно вызывать из разных потоков(Thread).Collector.Characteristics- это характеристики коллектора, а не стрима (Stream; приходится использовать такой англицизм во избежании путаницы, т.к. "поток" скорее ассоциируется с Thread). Т.о. обычный стрим тоже может быть собран параллельно, см.Collectors.groupingByConcurrent()Collectors.toConcurrentMap()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