, например:

овленныйэтот вопросЯ начал играть с упорядоченными и неупорядоченными потоками, параллельными и последовательными потоками и терминальными операциями, которые относятся к порядку встреч с терминальными операциями, которые его не уважают.

В одном ответе на связанный вопрос показан код, подобный этому:

List<Integer> ordered = Arrays.asList(
    1, 2, 3, 4, 4, 3, 2, 1, 1, 2, 3, 4, 4, 3, 2, 1, 1, 2, 3, 4);
List<Integer> result = new CopyOnWriteArrayList<>();

ordered.parallelStream().forEach(result::add);

System.out.println(ordered);
System.out.println(result);

И списки действительно разные.unordered список даже изменяется от одного прогона к другому, показывая, что результат фактически недетерминирован.

Итак, я создал этот другой пример:

CopyOnWriteArrayList<Integer> result2 = ordered.parallelStream()
        .unordered()
        .collect(Collectors.toCollection(CopyOnWriteArrayList::new));

System.out.println(ordered);
System.out.println(result2);

И я ожидал увидеть аналогичные результаты, так как поток является параллельным и неупорядоченным (возможно,unordered() избыточно, так как это уже параллельно). Однако результирующий список упорядочен, то есть он равен исходному списку.

Итак, мой вопрос, почему собранный список упорядочен? Есть лиcollect всегда соблюдать порядок встречи, даже для параллельных неупорядоченных потоков? Это конкретныйCollectors.toCollection(...) Коллекционер, который заставляет столкнуться с порядком?

Ответы на вопрос(0)

Ваш ответ на вопрос