안녕하세요.
이번 포스팅은 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
}
'기타 > 코틀린' 카테고리의 다른 글
[Kotlin] Sequence vs Collections (0) | 2022.07.05 |
---|---|
[Kotlin] inline과 reified (0) | 2022.07.02 |
코틀린 특징 및 자바와 차이점 정리(작성중) (0) | 2021.10.04 |
코틀린 Sealed Class와 Enum Class (0) | 2021.07.01 |
댓글