본문 바로가기
STUDY/Kotlin

Kotlin / 고차함수와 람다

by HR_J 2024. 4. 25.

Lambda

lambda 와 익명 함수는 함수 리터럴(function literals)이라고도 불린다.

함수 리터럴은 선언되지 않고 표현 그대로 바로 전달될 수 있다. ( 함수 리터럴은 선언되지 않았지만 즉시 표현식으로 전달됨)

max(strings, { a, b -> a.length < b.length })

함수의 마지막 매개 변수가 함수라면 괄호 밖으로 람다 식을 배치할 수 있다.

만약 함수의 매개 변수가 하나라면 괄호 내에서 it 으로 표현된다.

val listOne = listOf(1, 2, 3).map({it + 1}) // 원래는 이렇지만
val listTwo = listOf(1, 2, 3).map { it + 1 } // 이렇게 쓸 수도 있다.

리턴 값이 있어야 하는 함수 리터럴은, 마지막 줄이 리턴 값이 된다. 혹은 qualified return 으로 명시할 수 있다. (보통 중첩된 함수 사이에서 리턴 대상을 구분하려고 사용)

ints.filter {
    val shouldFilter = it > 0
    shouldFilter // 자동으로 리턴 대상이 된다.
}

ints.filter {
    val shouldFilter = it > 0
    return@filter shouldFilter // qualified return
}

 

Anonymous functions ( 익명함수 )

말 그대로 이름이 없는 함수. Lambda도 이름이 없긴 하지만, Kotlin에서 익명함수는 무조건 fun 키워드와 함께 쓰임.

lambda는 보통 return type을 드러내지 않기 때문에, 명시적으로 드러내고 싶을 경우 익명함수를 쓴다.

하지만, 대부분 return 타입은 자동으로 유추된다.

함수밖에 전달할 수 없다!

val plusFunc: (Int, Int) -> Int = fun(a, b): Int { return a + b }
val plusFunc = fun(a: Int, b: Int) { return a + b }

val list = listOf(1, 2, 3).map(fun(x): Int = x + 1)

 

함수 참조

::키워드로 클래스 내부에 선언된 함수를 파라미터로 사용할 수 있다.

val numbers = "1 2 3 4".split(" ").map(String::toInt)
// String 클래스의 toInt 함수가 map 함수의 transform이 된 것이다.

val numbers = "1 2 3 4".split(" ").map { it.toInt() } // 위와 같은 기능을 한다.

 

참고

https://kotlinlang.org/docs/lambdas.html#higher-order-functions

 

Higher-order functions and lambdas | Kotlin

 

kotlinlang.org

 

'STUDY > Kotlin' 카테고리의 다른 글

Kotlin / Scope Function - 범위 지정 함수  (0) 2024.05.31
Kotlin / Conditions and Loops (If, When, For, While)  (0) 2024.04.30
Kotlin / 숫자 야구 게임  (0) 2024.04.30
Kotlin / 고차함수  (0) 2024.04.24
Kotlin / 계산기 만들기  (0) 2024.04.22