담백로그

[Kotlin] Collection Functions

코틀린 컬렉션 확장 함수들을 알아봅니다. 필드에서 생각보다 많이 사용하므로 숙지해놓으면 좋습니다.

filter

특정 조건을 만족하는 컬렉션을 반환합니다.
조건에 만족하는 결과만 가져오는 것이므로 컬렉션의 크기가 달라질 수 있습니다.

val cars = listOf(
    Car("Malibu", "Chevrolet", "Sedan"),
    Car("Seltos", "Kia", "SUV"),
    Car("Sonata", "Hyundai", "Sedan"),
    Car("Palisade", "Hyundai", "SUV"),
    Car("Torres", "KG-Mobility", "SUV"),
    Car("K5", "Kia", "Sedan")
)

val group = cars.filter { it.type == "Sedan" }
println(group)

결과

typeSedan 과 일치하는 결과만 컬렉션으로 반환합니다.

[
    Car(name=Malibu, brand=Chevrolet, type=Sedan), 
    Car(name=Sonata, brand=Hyundai, type=Sedan), 
    Car(name=K5, brand=Kia, type=Sedan)
]

map

컬렉션 내 데이터에 특정 연산을 추가하거나 가공하여 새 데이터의 컬렉션으로 변환하여 반환합니다.
filter 와 다르게 컬렉션의 크기를 유지합니다.
데이터를 형변환할 때 사용하면 유용합니다.

val cars = listOf(
    Car("Malibu", "Chevrolet", "Sedan"),
    Car("Seltos", "Kia", "SUV"),
    Car("Sonata", "Hyundai", "Sedan"),
    Car("Palisade", "Hyundai", "SUV"),
    Car("Torres", "KG-Mobility", "SUV"),
    Car("K5", "Kia", "Sedan")
)

val group = cars.map { Car(it.name.uppercase(), it.brand, it.type ) }
println(group)

결과

자동차의 이름을 전부 대문자로 변환한 연산을 추가한 콜렉션이 반환된 것을 확인할 수 있습니다.

[
    Car(name=MALIBU, brand=Chevrolet, type=Sedan), 
    Car(name=SELTOS, brand=Kia, type=SUV), 
    Car(name=SONATA, brand=Hyundai, type=Sedan), 
    Car(name=PALISADE, brand=Hyundai, type=SUV), 
    Car(name=TORRES, brand=KG-Mobility, type=SUV), 
    Car(name=K5, brand=Kia, type=Sedan)
]

distinct

설정한 항목과 중복되는 항목을 제외한 컬렉션을 반환합니다.

fun main() {
    val cars = listOf(
        Car("Malibu", "Chevrolet", "Sedan"),
        Car("Seltos", "Kia", "SUV"),
        Car("Sonata", "Hyundai", "Sedan"),
        Car("Palisade", "Hyundai", "SUV"),
        Car("Torres", "KG-Mobility", "SUV"),
        Car("K5", "Kia", "Sedan")
    )

    val group = cars.distinctBy { it.brand }
    println(group)
}

data class Car(
    val name: String,
    val brand: String,
    val type: String
)

결과

[
    Car(name=Malibu, brand=Chevrolet, type=Sedan), 
    Car(name=Seltos, brand=Kia, type=SUV), 
    Car(name=Sonata, brand=Hyundai, type=Sedan), 
    Car(name=Torres, brand=KG-Mobility, type=SUV)
]

중복되는 brand 를 제외한 첫 번째 항목만 남은 컬렉션을 보여줍니다.

groupBy

설정한 항목을 키로 하여 그룹핑된 Map 을 반환합니다.

fun main() {
    val cars = listOf(
        Car("Malibu", "Chevrolet", "Sedan"),
        Car("Seltos", "Kia", "SUV"),
        Car("Sonata", "Hyundai", "Sedan"),
        Car("Palisade", "Hyundai", "SUV"),
        Car("Torres", "KG-Mobility", "SUV"),
        Car("K5", "Kia", "Sedan")
    )

    val group = cars.groupBy { it.brand }
    println(group)
}

data class Car(
    val name: String,
    val brand: String,
    val type: String
)

결과

아래와 같이 brand 항목을 기준으로 그룹핑하여 Map 을 반환합니다.

[
    Chevrolet=[Car(name=Malibu, brand=Chevrolet, type=Sedan)], 
    Kia=[Car(name=Seltos, brand=Kia, type=SUV), Car(name=K5, brand=Kia, type=Sedan)], 
    Hyundai=[Car(name=Sonata, brand=Hyundai, type=Sedan), Car(name=Palisade, brand=Hyundai, type=SUV)],
    KG-Mobility=[Car(name=Torres, brand=KG-Mobility, type=SUV)]
]

associateBy

선택한 항목을 키로 설정하여 Map 을 구성해줍니다.

fun main() {
    val cars = listOf(
        Car("Malibu", "Chevrolet", "Sedan"),
        Car("Seltos", "Kia", "SUV"),
        Car("Sonata", "Hyundai", "Sedan"),
        Car("Palisade", "Hyundai", "SUV"),
        Car("Torres", "KG-Mobility", "SUV"),
        Car("K5", "Kia", "Sedan")
    )

    val group = cars.associateBy { it.brand }
    println(group)
}

data class Car(
    val name: String,
    val brand: String,
    val type: String
)

결과

{
    Sedan=Car(name=K5, brand=Kia, type=Sedan), 
    SUV=Car(name=Torres, brand=KG-Mobility, type=SUV)
}

type 을 키로 설정했기에, 중복된 type 들은 모두 제외된 것을 볼 수 있다.

partition

특정 조건을 기준으로 참, 거짓의 두 개의 그룹으로 나누어 Pair<List, List> 객체를 반환합니다.

val cars = listOf(
    Car("Malibu", "Chevrolet", "Sedan"),
    Car("Seltos", "Kia", "SUV"),
    Car("Sonata", "Hyundai", "Sedan"),
    Car("Palisade", "Hyundai", "SUV"),
    Car("Torres", "KG-Mobility", "SUV"),
    Car("K5", "Kia", "Sedan")
)

val group = cars.partition { it.type == "Sedan" }
println(group)

결과

아래와 같이 type = "Sedan" 을 기준으로 두 개의 그룹으로 나뉘어 반환된 것을 볼 수 있습니다.

[
    Car(name=Malibu, brand=Chevrolet, type=Sedan), 
    Car(name=Sonata, brand=Hyundai, type=Sedan), 
    Car(name=K5, brand=Kia, type=Sedan)
], 
[
    Car(name=Seltos, brand=Kia, type=SUV), 
    Car(name=Palisade, brand=Hyundai, type=SUV), 
    Car(name=Torres, brand=KG-Mobility, type=SUV)
]