본문 바로가기
기타/코틀린

[Kotlin] map, flatMap 비교

by 창이2 2022. 6. 21.

안녕하세요.

이번 포스팅은 Kotlin의 map과 flatMap을 비교해보려고 합니다.

 

일단 map같은 경우

 

내부 구현은 아래와 같이 구현되어 있는데 좀 더 보자면

//_Collections.kt
public inline fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> {
    return mapTo(ArrayList<R>(collectionSizeOrDefault(10)), transform)
}

public inline fun <T, R, C : MutableCollection<in R>> Iterable<T>.mapTo(destination: C, transform: (T) -> R): C {
    for (item in this)
        destination.add(transform(item))
    return destination
}


//Iterables.kt
internal fun <T> Iterable<T>.collectionSizeOrDefault(default: Int): Int = if (this is Collection<*>) this.size else default

 

map을 사용하는 Iterable 객체가 Collection이면 해당 객체의 size를, 아니면 default로 설정된 사이즈를 갖고 10의 기본 사이즈를 갖는다.

 

그리고 mapTo를 호출할 때 빈 ArrayList를 넣고 map안의 action(transform)을 수행하여 빈배열에 추가해 다시 반환한다.

 

그 다음 faltMap을 보자

flatMap의 내부 구현은 map과는 다르게 Iterable<R>을 transform의 결과로 받고 있다.

즉 flatMap의 action(transform)은 list를 결과로 내야 한다.

그리고 이 list들은 destination의 addAll을 통해 하나의 리스트로 합쳐진다.

public inline fun <T, R> Iterable<T>.flatMap(transform: (T) -> Iterable<R>): List<R> {
    return flatMapTo(ArrayList<R>(), transform)
}


public inline fun <T, R, C : MutableCollection<in R>> Iterable<T>.flatMapTo(destination: C, transform: (T) -> Iterable<R>): C {
    for (element in this) {
        val list = transform(element)
        destination.addAll(list)
    }
    return destination
}

댓글