Сохраняет ли Java groupingBy collector порядок списка?


Рассмотрим список List<People>, в котором элементы отсортированы в порядке возрастания People.getAge(). Если мы сгруппируем этот список с помощью Collectors.groupingBy(People::getCity), останутся ли результирующие списки для каждой из групп/городов отсортированными по возрасту?

На практике это, кажется, действительно сохраняет порядок. Я ищу гарантию.

Javadoc для метода говорит:

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

Я не уверен, относится ли это к порядку пунктов в списке.
1 6

1 ответ:

Ключ к пониманию контракта заключается в том, что он гласит: "Порядок, в котором элементы появляются". Он говорит о том, поступают ли они в порядке, что подразумевает, передаются ли они в экстрактор ключей Function и в любой нисходящий коллектор в порядке; он ничего не говорит о том, будет ли порядок сохранен в любом результирующем накоплении; фактически текущая реализация groupingBy использует HashMap, который не сохраняет порядок ключей.

Вы спрашиваете, относится ли это к порядок следования пунктов в списке. Если вы ссылаетесь на список, из которого был создан поток, поток, созданный в списке, действительно начинает упорядочиваться, но некоторые операции потока изменяют порядок или делают его неупорядоченным, поэтому порядок, на который он ссылается, ссылается на результирующий порядок после выполнения операций конвейера, если поток остается упорядоченным. Если операции потока делают поток неупорядоченным, порядок, в котором элементы появляются в коллекторе, больше не является проблемой.

Если вы имеете в виду к порядку элементов в списке сгруппированные элементы собираются, да, это так, потому что" порядок, в котором появляются элементы " - это порядок, в котором элементы обрабатываются. То же самое верно и при группировании в нижестоящий коллектор; если поток все еще упорядочен, и вы группируетесь в нижестоящий коллектор, который сохраняет порядок, это сохранит этот порядок, в то время как параллельная версия может этого не делать.