Ответ 1
Здесь происходит два разных типа "упорядочивания", что затрудняет обсуждение.
Один вид - это порядок встреч, который определен в потоковой документации. Хороший способ подумать об этом - это пространственный или левый-правый порядок элементов в исходной коллекции. Если источником является List
, рассмотрим более ранние элементы слева от более поздних элементов.
Существует также обрабатывающий или временный порядок, который не определен в документации, но который является порядком времени, в котором элементы обрабатываются разными потоками. Если элементы списка обрабатываются параллельно разными потоками, поток может обрабатывать самый правый элемент в списке перед самым левым элементом. Но в следующий раз это не так.
Даже когда вычисления выполняются параллельно, большинство Collectors
и некоторые операции с терминалом тщательно организованы так, что они сохраняют порядок вызова от источника до адресата независимо от временного порядка, в котором различные потоки могут обрабатывать каждый элемент.
Обратите внимание, что операция терминала forEach
делает не сохранение порядка встреч. Вместо этого он запускается через любой поток, чтобы произвести следующий результат. Если вы хотите что-то вроде forEach
, которое сохраняет порядок встреч, используйте forEachOrdered
вместо этого.
См. также Часто задаваемые вопросы лямбда для дальнейшего обсуждения проблем с заказами.