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 крайне не желают вводить такие нарушения, даже если для этого есть серьезные основания.
Здесь мало оснований для такого изменения; Я считаю безопасным полагаться на это поведение.