기록창고

Collectors GroupingBy 본문

JAVA

Collectors GroupingBy

방금시작한사람 2020. 1. 16. 15:42

Todo List 웹를 만드는 도중 DB 에서 가져온 데이터를 현재 진행 현황에 맞춰서 분리해서 보여줘야할 때가 있었다.

public class TodoDto {
    private int id;
    private String title;
    private String step;
} // getter 와 setter 와 constructor는 모두 구현되어있다고 가정한다.

DB 쿼리는 전부를 가져오는 쿼리문이였따.


SELECT * FROM todo;

쿼리를 step 별로 던지면 안해도 됐을 거 같지만 ....

 

처음 코드는 모두를 가져와서 iterator를 돌면서 step 에 맞게 list 에 추가했다.

 

List<TodoDto> todoList = getList(); // 전부를 가져온다.
List<TodoDto> doingList = new ArrayList<>();
List<TodoDto> doneList = new ArrayList<>(); 

for(Iterator<TodoDto> it = todoList.iterator(); it.hasNext();) {
    TodoDto todo = it.next();
    String step = todo.getStep();

    if(step == "TODO") { ... }
    else if(step == "DOING") { ... }
    else if(step == "DONE") { ... }
    else { /* 예외처리 */ }
}

// 아래로 진행

위의 코드처럼 iterator를 돌면서 추가를 하니까 코드가 길어보이고

불필요한 코드가 많아진거 같다는 코드 리뷰가 있었다.

 

그래서 찾아보니 Stream API 중 groupingBy 이라는 함수가 있었다.

 

Map<String, List<TodoDto>> listGroupByStep = todoList.stream()
                                                     .collect(Collectors.groupingBy(TodoDto::getStep));                                                     
// listGroupByStep.get("TODO") => step이 TODO 인 List를 리턴한다.
// listGroupByStep.get("DOING") => step이 DOING 인 List를 리턴한다.

 

길었던 코드가 한줄로 바뀌고, groupingBy라는 걸 모르는 사람이 봐도 딱 알게 생겼다.

 

JAVA stream이 굉장하게 좋다는 걸 깨닫는 순간이였다...

 

다 좋지만 단점이라고 생각하는게 하나 있었다.

 

위처럼 iterator로 돌면 TODO, DOING, DONE 이외의 것이 혹시 들어가 있는 경우

else 문으로 빼서 예외처리나 그 다음 대응이 가능하다.

 

물론 아직 groupingBy에 대해 다 알지 못하기 때문에 이런 기능이 혹시 있을 지 모르나..

 

짧은 생각에는 예외처리가 불편할 거 같다.. (ENUM으로 하면 자동으로 error가 발생할까..?)

 

그럼에도 불구하고 되게 편하다.

'JAVA' 카테고리의 다른 글

기본형과 래퍼 클래스(Wrapper Class)  (0) 2020.02.18
String.equals()  (0) 2020.01.19
JAVA List for 문으로 remove하기  (0) 2020.01.05
equals() override  (0) 2019.12.28
hashCode() override  (0) 2019.12.27
Comments