Kotlin에서 리스트를 그룹핑 하는 groupingBy는 "그룹핑 전략"만 정의하는 객체(Grouping)를 반환합니다.
즉, 아직 결과가 만들어진 건 아니고, 터미널 연산을 붙여야 최종 Map이 생성됩니다.
val list = listOf(1, 2, 2, 3, 3, 3)
val grouping = list.groupingBy { it }
// Grouping 객체만 생성됨
Grouping에 붙일 수 있는 터미널 연산은 총 4가지입니다.
eachCount(), fold(), reduce(), aggregate()
각 그룹별 원소의 개수를 세어줍니다.
반환: Map<K, Int>
val list = listOf(1, 2, 2, 3, 3, 3)
val result = list.groupingBy { it }.eachCount()
// {1=1, 2=2, 3=3}
그룹마다 초기값을 두고, 원소들을 누적 처리합니다.
반환: Map<K, R>
val result = list.groupingBy { it % 2 }
.fold(0) { acc, _ -> acc + 1 }
// {1=3, 0=3} (홀수 3개, 짝수 3개)
그룹별 첫 원소를 시작 값으로 두고, 나머지를 순차적으로 누적합니다.
반환: Map<K, T>
val result = list.groupingBy { it }.reduce { _, acc, e -> acc + e }
// {1=1, 2=4, 3=9} (같은 숫자 합치기)
가장 범용적인 연산입니다.
accumulator를 직접 정의할 수 있어, fold·reduce보다 자유도가 높습니다.
val result = list.groupingBy { it }.aggregate { _, acc: Int?, e, _ ->
(acc ?: 0) + e
}
// {1=1, 2=4, 3=9}