웹 개발을 하다보면 리스트에서 항목 중 자식 리스트를 갖는 것을 표현하고 싶을 때 유용하게 쓸 수 있다.
Course | League |
1코스 | 1부 |
1코스 | 2부 |
2코스 | 1부 |
2코스 | 2부 |
데이터 베이스에서 4행이 리턴된다. 1코스 = {1부, 2부} , 2코스 = {1부, 2부}
Course | League |
1코스 | [{부=1부, 코스=1코스}, {부=2부, 코스=1코스}] |
2코스 | [{부=1부, 코스=2코스}, {부=2부, 코스=2코스}] |
화면에서는 위와 같이 2행으로 보여주려면 어떻게 해야 할까?
Java Stream GroupBy을 이용하여 변경할 수 있다.
기본 데이터
List<Map<String, String>> list = new ArrayList<>();
Map<String, String> course1_1 = new HashMap<>();
course1_1.put("코스", "1코스");
course1_1.put("부", "1부");
Map<String, String> course2_2 = new HashMap<>();
course2_2.put("코스", "2코스");
course2_2.put("부", "2부");
Map<String, String> course2_1 = new HashMap<>();
course2_1.put("코스", "2코스");
course2_1.put("부", "1부");
Map<String, String> course1_2 = new HashMap<>();
course1_2.put("코스", "1코스");
course1_2.put("부", "2부");
list.add(course1_1);
list.add(course1_2);
list.add(course2_1);
list.add(course2_2);
Stream 에 group by 를 활용
List<Map> newList = list.stream()
.collect(Collectors.groupingBy((map) -> map.get("코스")))
.entrySet().stream()
.sorted((a, b) -> b.getKey().compareTo(a.getKey()))
.map(entry -> {
Map map = new HashMap();
map.put("course", entry.getKey());
map.put("league", entry.getValue());
return map;
})
.collect(Collectors.toList());
결과는
courseAndData = {league=[{부=1부, 코스=2코스}, {부=2부, 코스=2코스}], course=2코스}
courseAndData = {league=[{부=1부, 코스=1코스}, {부=2부, 코스=1코스}], course=1코스}