나누고 싶은 개발 이야기

Data Engineer로서 기록하고 공유하고 싶은 기술들. 책과 함께 이야기합니다.

Language/Java

[Java8] sorted groupBy

devidea 2019. 1. 11. 14:21
이번에는 간단한 주제로 글을 짧게 남겨보고자 한다. stream의 groupBy와 관련된 내용이다.

개발을 하다가 List에 있는 객체의 특정 값으로 groupBy를 했다. 문제는 groupBy된 결과가 group key로 사용한 값의 순서로 정렬이 되지 않은 부분이다. 데이터 가공의 결과로 group key 값으로 정렬을 해줘야 사용하는 측에서 용이했기 때문이다.

관련해서 java doc을 찾아보았더니 같은 groupBy 함수에서 argument가 다른 함수가 존재했다.
public static <T,K,D,A,M extends Map<K,D>> Collector<T,?,M> groupingBy(
Function<? super T,? extends K> classifier, Supplier<M> mapFactory, Collector<? super T,A,D> downstream)

함수 파라미터는 다음과 같다.
  • classifier : groupBy를 위한 기준값을 가져오는 function
  • mapFactory : 함수의 수행 결과로서 새롭게 만들어지는 Map을 생성하는 function
  • downstream : groupBy의 수행결과로서 얻어지는 결과 Collector

내가 처음 썼던 함수와 다른 부분은 2번째 파라미터 mapFactory가 추가된 부분이다. 이때 TreeMap::new를 전달하게 되면 groupBy로 인해 새롭게 만들어지는 Map은 TreeMap으로 만들어진다. TreeMap은 red-black tree로 구현되어 있어 key값에 의해 정렬이 되어 있는 구조로 되어 있다. red-black tree의 이론적 설명은 추후 다른 글로 작성해 보도록 하겠다.

함수 정의만 보면은 이해가 안 될 수 있어 아래 코드는 정렬이 가능한 groupBy 함수의 예제를 작성해 보았다.


관련 문서


반응형