Как сделать Collectors.groupingBy эквивалентным в Java 6? - PullRequest
3 голосов
/ 09 апреля 2020

у меня есть List<UserVO> Каждый UserVO имеет getCountry ()

Я хочу сгруппировать List<UserVO> на основе его getCountry()

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

Это на Java8. Я хочу это в Java6

Map<String, List<UserVO>> studentsByCountry
= resultList.stream().collect(Collectors.groupingBy(UserVO::getCountry));

for (Map.Entry<String, List<UserVO>> entry: studentsByCountry.entrySet())
    System.out.println("Student with country = " + entry.getKey() + " value are " + entry.getValue());

Я хочу вывод, похожий на Map<String, List<UserVO>>:

CountryA - UserA, UserB, UserC
CountryB - UserM, User
CountryC - UserX, UserY

Редактировать: Могу ли я еще раз перестановить этот Map, чтобы отобразить в соответствии с displayOrder стран. Порядок отображения: страна C = 1, страна B = 2 и страна A = 3

Например, я хочу отобразить

CountryC - UserX, UserY
CountryB - UserM, User
CountryA - UserA, UserB, UserC

1 Ответ

4 голосов
/ 09 апреля 2020

Вот как вы делаете это с простым Java. Обратите внимание, что Java 6 не поддерживает оператор diamond, поэтому вы постоянно используете <String, List<UserVO>>.

Map<String, List<UserVO>> studentsByCountry = new HashMap<String, List<UserVO>>();
for (UserVO student: resultList) {
  String country = student.getCountry();
  List<UserVO> studentsOfCountry = studentsByCountry.get(country);
  if (studentsOfCountry == null) {
    studentsOfCountry = new ArrayList<UserVO>();
    studentsByCountry.put(country, studentsOfCountry);
  }
  studentsOfCountry.add(student);
}

Это короче с потоками, верно? Поэтому попробуйте обновить до Java 8!

Чтобы иметь определенный c порядок, основанный на обратной буквенной строке, как указано в комментариях, вы можете заменить первую строку следующим:

Map<String,List<UserVO>> studentsByCountry = new TreeMap<String,List<UserVO>>(Collections.reverseOrder());
...