웹 개발을 하다보면 리스트에서 항목 중 자식 리스트를 갖는 것을 표현하고 싶을 때 유용하게 쓸 수 있다. 

 

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코스}

+ Recent posts