Kotlin map 함수 - 리스트 값들 변경

Notepad96

·

2020. 11. 25. 22:39

300x250

 

 

 

 


1. map 함수

 

filter 함수가 리스트와 맵 같은 Collections 타입에서 조건에 만족하는 원소를 걸러내는(탐색하는) 함수 였다면

 

map 함수는 필요하다면 조건에 따라 일정한 연산을 해주고 싶을 경우 사용할 수 있다.

 

 

 

 

Kotlin filter - 조건에 맞는 원소 검색

1. filter filter 함수는 Array, List, Set, Map 에서 사용할 수 있으며 특정 조건을 주면 해당 조건에 만족하는 원소들을 구할 수 있다. 해당 결과는 for문과 if식을 사용하면 똑같은 결과를 얻을 수도 있지

notepad96.tistory.com

 

map함수의 결과 또한 filter처럼 for과 if문을 사용하면 똑같은 결과를 얻을 수도 있지만 map 함수를 사용함으로써 간단하게 한줄로도 작성이 가능해 진다.

 

 

 

또한, filter는 조건에 만족하는 원소를 찾기 때문에 크기가 달라질 수도 있었지만 map은 크기는 유지된다.

 

 

 

 

 


2. 코 드

환경 : Kotlin Version = 1.4.10, JVM

fun main(args : Array<String>) {
    println("==============LIST=================")
    val ml = mutableListOf(1, 2, 3, 4, 5, 6, 7, 8)
    println("1. ${ml.toString()}")

    val ml2 = ml.map { it + 10 }
    if(ml2 is List<Int>) println("List")
    println("2. ${ml2.toString()}")

    val ml3 = ml.mapIndexed { index, i -> index % 2 == 0 }  // 인덱스가 짝수이면 true, 아니면 false
    println("3. ${ml3.toString()}") // boolean 타입의 리스트


    println("============================================")
    val mls = mutableListOf( "f45", "543", "dsa", "", "461")
    val mls2 = mls.map { it.toIntOrNull() }         // Int형으로 바꾸지 못한다면 Null
    val mls3 = mls.mapNotNull { it.toIntOrNull() }  // Null은 포함하지 않는다.
    println("1. ${mls2.toString()}")
    println("2. ${mls3.toString()}")



    println("==============SET=================")
    val ms = mutableSetOf(5, 2, 3, 1, 4, 6)
    println("1. ${ms.toString()}")

    val ms2 = ms.map { if(it % 2 == 0) it * it else it }    // 짝수일 경우 제곱, 아니면 그대로
    if(ms2 is List<Int>) println("List")
    println("2. ${ms2.toString()}")



    println("==============MAP=================")
    val mm = mutableMapOf(1 to "avd", 3 to "zcd", 4 to "fds", 2 to "qwe")
    println("1. ${mm.toString()}")

    val mm2 = mm.map { it.key * 10 }
    if(mm2 is List<Int>) println("List")
    println("2. ${mm2.toString()}")

    val mm3 = mm.mapKeys { "new${it.key}" }     // Key의 값들을 앞에 new가 붙는 문자열로 만든다.
    if(mm3 is Map<String, String>) println("Map<String, String>")
    println("3. ${mm3.toString()}")

    val mm4 = mm.mapValues { it.key * it.key }  // Value의 값들을 Key의 제곱의 수로 만든다.
    if(mm4 is Map<Int, Int>) println("Map<Int, Int>")
    println("4. ${mm4.toString()}")
}

 

결 과

 

- Int 타입의 List를 map을 통하여 10씩 더해주었다.

 

덧셈 연산을 하였기 때문에 그 결과로 얻은 List의 타입이 Int가 되는 것이다.

 

만약 map 내부에서 결과로서 문자열이 나온다면 String 타입의 List가 반환된다.

 

 

 

 mapIndexed를 사용하여 인덱스와 값 둘을 이용하여 조건을 주거나, 새로운 값을 만들어 낼 수 있다.

 

 mapNotNull은 이름 그대로 Null은 포함시키지 않는다.

 

 

 

 

- Set의 map 결과로서 Int타입의 List를 얻는다.

 

map 내부에서 if 식을 사용하여 조건에 따라 값을 변경하거나 변경하지 않을 수도 있다.

 

 

 

 

- Map에서 map을 사용하였을 경우 List 타입이 반환된다.

 

만약 Map에 형태를 유지하고자 하면

 

mapKeys : 결과에 따라 Map의 Key 값들이 변경된다. (Value는 유지)

 

mapValues : 결과에 따라서 Map의 Value 값들이 변경된다. (Key는 유지)

 

를 사용할 수 있다.

 

 

 

Map 또한 map에서 연산의 따라 제네릭 타입이 변경된다.

 

위 예시에서 mapValues를 사용하여 Map<Int, Int> 형태의 Map을 얻었다.

 

 

 

 


3. 참 조

 

 

map - Kotlin Programming Language

 

kotlinlang.org

 

300x250