목차로 돌아가기
목표
- 그룹핑 함수 groupBy의 개념과 동작을 익힌다.
- 두개의 Collection을 조합하는 zip의 개념과 동작을 익힌다.
- 중복제거 함수 distinct의 동작을 익힌다.
확장함수 목록
groupBy
groupBy는 keySelector함수를 통해 key를 select하여 해당 Key로 Map을 만드는(그룹화 하는) 함수이다.
public inline fun <T, K> Iterable<T>.groupBy(keySelector: (T) -> K): Map<K, List<T>>
groupBy의 key는 다양하게 나뉠 수 있는데, 아래 예시를 통해 알아보자. 아래 예시는 짝수와 홀수를 나누는 예시이다.
(0..10).toList().groupBy { it % 2 }
// {0=[0, 2, 4, 6, 8, 10], 1=[1, 3, 5, 7, 9]}
keySelector은 받은 값을 2로 나눈 나머지 값을 key로 선택했고, 따라서 0과 1이 선택되고 해당하는 Map이 생성되었다. 이에 대한 짝수만을 다음과 같이 key값을 이용해 뽑아낼 수 있다.
(0..10).toList().groupBy { it % 2 }[0] // key값 0에 대한 출력
// [0, 2, 4, 6, 8, 10]
zip
zip은 두개의 Iterable을 조합하여 각 원소를 순서대로 Pair로 만들어, List<Pair<T,R>>로 만드는 확장함수이다.
public infix fun <T, R> Iterable<T>.zip(other: Iterable<R>): List<Pair<T, R>>
만약 두 Iterable의 길이가 다를 경우, 작은 Iterable의 길이를 따른다.
val listString = listOf("a", "b", "c")
val listNumber = listOf(1, 2, 3, 4)
print(listString.zip(listNumber)) // [(a, 1), (b, 2), (c, 3)]
distinct
- distinct
distinct는 Iterable에서 중복을 제외한 값을 반환하는 확장함수이다.
public fun <T> Iterable<T>.distinct(): List<T>
아래 예제에서는 뒤에 나온 1, 2, 3 이 중복으로 제거되어 1, 2, 3, 4, 5, 6이 출력이 되었다.
val listNumber = listOf(1, 2, 3, 4, 5, 1, 2, 3, 6)
listNumber.distinct() // [1, 2, 3, 4, 5, 6]
- distinctBy
distinctBy는 Iterable에서 특정 조건(selector)을 수행했을 때 중복되는 값을 제외하고 반환하는 확장함수이다.
public inline fun <T, K> Iterable<T>.distinctBy(selector: (T) -> K): List<T>
아래 예시를 보면 1에 대한 %3 은 1이고, 2에 대한 %3은 2, 3에 대한 %3은 0이다. 하지만 4에대한 %3은 1에대한 %3과 중복되어 제거되고, 그 이후에 나오는 5, 6 또한 마찬가지이다. 따라서 1, 2, 3만이 출력값이 된다.
val listNumber = listOf(1, 2, 3, 4, 5, 6)
listNumber.distinctBy { it % 3 } // [1, 2, 3]
반응형