고차 함수는 다른 함수를 인자로 받거나 함수를 반환하는 함수이다.
→ 람다나 함수 참조를 인자로 넘길 수 있거나 람다나 함수 참조를 반환하는 함수
람다를 인자로 받는 함수를 정의하는 방법
// 람다를 로컬변수에 대입
val sum = { x: Int, y: Int -> x + y }
val action = { println(42) }
코틀린의 타입추론으로 인해 타입을 지정하지 않아도 된다. → 함수 타입으로 추론.
val sum: (Int, Int) -> Int = { x, y -> x + y } // Int 파라미터 2개를 받아서 Int를 반환
val action: () -> Unit = { println(42) } // 아무 인자도 받지 않고 아무값도 반화하지 않는 함수
위 코드는 구체적인 타입 선언을 추가한 것.
(Int, String) -> Unit
함수 타입을 선언할 땐 반환 타입을 반드시 명시해야한다.
변수 타입을 함수 타입으로 지정하면 람다의 파라미터 타입을 유추할 수 있다.
var canReturnNull: (Int, Int) -> Int? = { x, y -> null } // 널이될 수 있는 함수 타입의 변수
var funOrNull: ((Int, Int) -> Int)? = null // 함수 타입 전체가 널
함수 타입에서 파라미터 이름을 지정할 수 있다.
fun performRequest(
url: String,
callback: (code: Int, content: String) -> Unit
)
(2)
fun performRequest(
url: String,
callback: (code: Int, content: String) -> Unit // 인자로 함수 전달
) {
// server call
(3)
callback(200, "Ok") // 함수호출
}
(1)
performRequest("localhost:8080") { code, message ->
println("result : ${code} : ${message}") // callback(200, "Ok") 실행결과
}
callback(200, "Ok")
는 인자로 들어온 람다표현식에 파라미터를 넣어준다.