Сохраняет ли Java groupingBy collector порядок списков?
рассмотрим список List<People>
где элементы сортируются в порядке возрастания People.getAge()
. Если мы этот список с помощью Collectors.groupingBy(People::getCity)
, будут ли результирующие списки для каждой из групп / городов оставаться отсортированными по возрасту?
на практике, похоже, он сохраняет порядок. Я ищу гарантию.
Javadoc для метода говорит:
если сохранение порядка, в котором элементы появляются в результирующем коллекторе карт, не требуется, используя groupingByConcurrent (функция) может предложить лучшую параллельную производительность
Я не уверен, что это относится к порядку элементов в списке.
1 ответов
ключ к пониманию контракта заключается в том, где говорится: "порядок, в котором элементы появляется". Он говорит о том, прибывают ли они в порядке, что подразумевает, передаются ли они в key extractor Function
и любому нижестоящему коллектору в порядке; он ничего не говорит о том, будет ли порядок сохранен в любом результирующем накоплении; на самом деле текущая реализация groupingBy
использует HashMap
который не сохраняет порядок ключей.
вы спросите, относится ли это к порядку элементов в списке. Если вы ссылаетесь на список, из которого был создан поток, поток, созданный в списке, начинает упорядочиваться, но некоторые операции потока изменяют порядок или делают его неупорядоченным, поэтому порядок, на который он ссылается, ссылается на результирующий порядок после выполнения операций конвейера, если поток остается упорядоченным. Если операции потока делают поток неупорядоченным, порядок, в котором элементы появляются в сборщике, не является проблемой длиннее.
Если вы ссылаетесь на порядок элементов в списке, в который собираются сгруппированные элементы, да, это так, потому что "порядок, в котором появляются элементы" - это порядок, в котором обрабатываются элементы. То же самое верно при группировании в нижестоящий коллектор; если поток по-прежнему упорядочен, и вы группируете в нижестоящий коллектор, который сохраняет порядок, это сохранит этот порядок, в то время как параллельная версия может не сохраняться.