Lewis's Tech Keep

[Kotlin] 코틀린 적응기 - 람다, 컬렉션 함수형 본문

Kotlin/Kotlin 적응기

[Kotlin] 코틀린 적응기 - 람다, 컬렉션 함수형

Lewis Seo 2024. 10. 1. 22:03

시작

람다 형식이 달라서 약간 어색하지만 유용하게 사용할 수 있기를!

 

배우고 있는 것

https://www.inflearn.com/course/java-to-kotlin

 

자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide) 강의 | 최태현 - 인프런

최태현 | 이 강의를 통해 Kotlin 언어의 특성과 배경, 문법과 동작 원리, 사용 용례, Java와 Kotlin을 함께 사용할 때에 주의할 점 등을 배울 수 있습니다., 요즘 대세인 코틀린을 공부하고 싶다면?⭐ J

www.inflearn.com

 

 

1. 람다

람다 그 자체를 변수로 사용하거나, 파라미터로 넘길 수 있다.

// 함수 그 자체로 변수에 할당할 수도, 파라미터로 사용 될 수도 있다.
fun main() {
    val fruits = listOf(
        Fruit("사과", 1_000),
        Fruit("사과", 1_200),
        Fruit("사과", 1_200),
        Fruit("사과", 1_500),
        Fruit("바나나", 3_000),
        Fruit("바나나", 2_000),
        Fruit("바나나", 2_500),
        Fruit("수박", 10_000),
    )

    val isApple: (Fruit) -> Boolean = fun(fruit: Fruit): Boolean {
        return fruit.name == "사과"
    }

    val isApple2 = { fruit: Fruit -> fruit.name == "사과" }

    // call
    isApple(fruits[0])
    isApple.invoke(fruits[0])

    // filter
    filterFruits(fruits, isApple2)
    filterFruits(fruits) { fruit -> fruit.name == "사과" }
}

private fun filterFruits(
    fruits: List<Fruit>, filter: (Fruit) -> Boolean)
        : List<Fruit> {
    val results = mutableListOf<Fruit>()
    for (fruit in fruits) {
        if (filter.invoke(fruit)) {
            results.add(fruit)
        }
    }

    return results
}

 

2. 컬렉션 함수형 다루기

아래 예시와 같은 다양한 형태로 사용 가능하다.

필요할 때 찾아보는 것이 더 좋다.

fun main() {
    val fruits = listOf(
        Fruit("사과", 1_000),
        Fruit("사과", 1_200),
        Fruit("사과", 1_200),
        Fruit("사과", 1_500),
        Fruit("바나나", 3_000),
        Fruit("바나나", 2_000),
        Fruit("바나나", 2_500),
        Fruit("수박", 10_000),
    )

    // filter
    filterFruits(fruits) { fruit -> fruit.name == "사과" }

    // toMap
    /* name, List<Fruit> */
    fruits.groupBy { fruit -> fruit.name }
    /* name, Fruit */
    fruits.associateBy { fruit -> fruit.name }
    /* name, List<Int(price)> */
    fruits.groupBy ({ fruit -> fruit.name }, { fruit -> fruit.price})
}

private fun filterFruits(
    fruits: List<Fruit>, filter: (Fruit) -> Boolean)
        : List<Fruit> {


    return fruits.filter(filter)
}
Comments