개발자이야기
kotlin map, flatMap 본문
map, flatMap
유용한 함수 map과 flatMap에 대해 kotlin 코드로 알아보겠습니다.
map
코틀린 Collections 에 정의된 함수 먼저 간단하게 살펴보겠습니다.
public inline fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> {
//수신객체인 this 로 mapTo 함수 호출
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) //수신객체인 this 를 반복
destination.add(transform(item)) //고차함수인 transform 호출하여 코드블럭 실행하여 결과값 반환
return destination
}
map 함수 내에서 mapTo 함수를 호출하여 mapTo 함수 내에 확장함수로 전달받은 array의 값을 for 문으로 반복하여 transform(item)고차함수의 코드블록을 실행하여 결과값을 반환받은 뒤 destination.add() 시켜주어 리턴 시켜주는 방식입니다.
(간단하게 array 안의 데이터를 반복문으로 코드블록에 전달하여 가공하여 반환받는 것 입니다.)
class Kmain {
companion object {
@kotlin.jvm.JvmStatic
fun main(args: Array<String>) {
val data = listOf(1, 3, 5)
val transform = data.map {
it * 10 //코드블럭이 실행되어 결과값 반환
}
println(transform.map { it })
}
}
}
결과값
[10, 30, 50]
위와 같이 리스트의 값을 가공할때 유용하게 사용할 수 있습니다.
val data = listOf(1, 3, 5)
val transform = data.map {
it * 10
}
val transform2: MutableList<Int> = mutableListOf()
for (item in data) {
transform2.add(item * 10)
}
위의 for 문과 map 함수는 동일한 역할을 수행합니다.
flatMap
public inline fun <T, R> Iterable<T>.flatMap(transform: (T) -> Iterable<R>): List<R> {
//확장함수 수신객체인 this 를 flatMapTo 함수를 호출
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) { //수신객체인 this 를 반복
val list = transform(element) //고차함수를 호출해 코드블럭을 실행 반환값은 list이여야 한다.
destination.addAll(list) //반환받은 list 를 destination 변수에 add
}
return destination
}
위의 Collections 에 정의된 flatMap 함수를 살펴보면 map 함수와 비슷합니다.
유의하여 볼 영역은 flatMapTo 함수의 파라미터인 transform 고차함수의 반환타입 입니다.
map 함수와 다르게 flatMap은 코드블럭의 반환값으로 Iterable<R> 을 반환해 주어야 되는것을 알 수 있습니다.
이로 인해 list 를 코드블럭에서 반환해야 하며 아래와 같이 사용할 수 있습니다.
class Kmain {
companion object {
@kotlin.jvm.JvmStatic
fun main(args: Array<String>) {
val list = listOf(mutableListOf("1", "2"), mutableListOf("3","4"))
val transform = list.flatMap {
it.toList()
}
println(transform)
}
}
}
결과값
[1, 2, 3, 4]
2차원 배열의 값을 1차원 배열의 값으로 변환하여 사용할 수 있습니다.
val list = listOf(mutableListOf("1", "2"), mutableListOf("3","4"))
val transform = list.flatMap {
it.toList()
}
val list2: MutableList<String> = mutableListOf()
list.forEach { itemList ->
itemList.forEach { item ->
list2.add(item)
}
}
결과값
[1, 2, 3, 4]
위의 두개의 코드는 동일한 역할을 수행합니다.
map 함수와 flatMap 함수에 대해 간략히 알아봤습니다. 읽어주셔서 감사합니다.
'kotlin' 카테고리의 다른 글
kotlin coroutine (0) | 2021.08.24 |
---|---|
kotlin data model 쉽게 만들기 (0) | 2021.08.02 |
kotlin 고차함수 (1) | 2021.06.06 |
kotlin scope functions (let,run,with,apply,also) (0) | 2021.06.01 |