Java Collectors.groupingBy() --- упорядочен ли список?

Для Collectors.groupingBy(), который возвращает Map<K,List<T>>, подразумевается ли это, что List<T> предназначен для оценки потока?

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

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

Ответ 1

Документация для groupingBy() гласит:

Требования к реализации:

Это дает результат, аналогичный следующему:

groupingBy(classifier, toList());

Документация для toList() гласит:

Возврат:

a Collector, который собирает все входные элементы в List, в порядке выполнения

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


РЕДАКТИРОВАТЬ: Как указывает @Holger, groupingBy() также должен был бы соблюдать порядок встреч, чтобы сохранить ограничение порядка toList(). Тот факт, что он делает это, явно подразумевается в этой заметке:

Примечание по реализации:

... Если сохранение порядка, в котором элементы появляются в результирующем сборнике Map, не требуется, использование groupingByConcurrent(Function) может обеспечить лучшую параллельную производительность.

Ответ 2

К сожалению, эта гарантия не указывается четко.

Однако результирующий Collector в настоящее время не имеет характеристики UNORDERED, поэтому на самом деле результирующий List упорядочен.

Остается вопрос, потому что нет договора API, запрещающего его, может ли будущая версия (или альтернативная реализация) добавить эту характеристику и создать неупорядоченные списки? На практике как OpenJDK, так и Oracle крайне не желают вводить такие нарушения, даже если для этого есть серьезные основания.

Здесь мало оснований для такого изменения; Я считаю безопасным полагаться на это поведение.