Автор java 8 в действии пишет этот класс:
class ToListCollector<T> implements Collector<T, List<T>, List<T>> {
@Override
public Supplier<List<T>> supplier() {
return ArrayList::new;
}
@Override
public BiConsumer<List<T>, T> accumulator() {
return List::add;
}
@Override
public BinaryOperator<List<T>> combiner() {
return (l1, l2) -> {
l1.addAll(l2);
return l1;
};
}
@Override
public Function<List<T>, List<T>> finisher() {
return Function.identity();
}
@Override
public Set<Characteristics> characteristics() {
return Collections.unmodifiableSet(EnumSet.of(Characteristics.IDENTITY_FINISH, Characteristics.CONCURRENT));
}
}
Затем он говорит о том, что означают различные значения в перечислении характеристик.И затем он объясняет, почему этот созданный им сборщик является IDENTITY_FINISH и CONCURRENT, а не UNORDERED, говоря:
Разработанный до сих пор ToListCollector является IDENTITY_FINISH, поскольку список, используемый для накопления элементов в потоке, уже являетсяожидаемый конечный результат и не нуждается в дальнейшем преобразовании, но это НЕ НЕПРАВИЛЬНО, потому что если вы применяете его к упорядоченному потоку, вы хотите, чтобы этот порядок был сохранен в результирующем Списке.Наконец, это CONCURRENT, но после того, что мы только что сказали, поток будет обрабатываться параллельно, только если его основной источник данных неупорядочен.
Почему поток будет обрабатываться параллельно только если основной источник неупорядочен?Я думаю, что он все еще будет обрабатываться параллельно, но combiner () должен будет сохранить порядок.Это ошибка в книге?
Я думаю, что Брайан Гетц довольно ясно говорит о параллельной обработке упорядоченных потоков в этом посте в последнем парафрафе.
Страницы вкнига 192 - 193.