Путаница с характеристиками. UNORDERED в Java 8 в книге действий - PullRequest
0 голосов
/ 31 мая 2018

Автор 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.

1 Ответ

0 голосов
/ 31 мая 2018

Это просто неправильно.Даже добавление характеристики CONCURRENT здесь неверно, так как в Supplier вам понадобится многопоточная структура данных.

...