Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

개발자이야기

kotlin map, flatMap 본문

kotlin

kotlin map, flatMap

개발자가되고싶어 2021. 6. 25. 00:46
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