다른 함수를 인자로 받거나 함수를 반환하는 함수이다. 코틀린에서는 람다나 함수 참조를 사용해 함수를 값으로 표현할 수 있다. 따라서 고차 함수는 람다나 함수 참조를 인자로 넘길 수 있거나 람다나 함수 참조를 반환하는 함수이다. 물론 함수를 인자로 받는 동시에 함수를 반환하는 함수도 고차함수이다.
람다를 인자로 받는 함수를 정의하려면 먼저 람다 인자의 타입을 어떻게 선언할 수 있는지 알아야 한다.
val sum: (Int, Int) -> Int = { x, y -> x + y}
val sum = { x: Int, y:Int -> x + y }
// 같음
함수 타입을 정의하려면 함수 파라미터의 타입을 괄호 안에 넣고 그 뒤에 화살표( -> )를 추가한 다음, 함수의 반환 타입을 지정하면 된다.
// 코틀린 함수 타입 문법
(Int, String) -> Unit = {
...
}
(Int, String) : 파라미터 타입
Unit : 반환타입
다른 함수와 마찬가지로 함수 타입에서도 반환 타입이 null이 될 수 있는 타입으로 지정할 수 있다.
var canReturnNull: (Int, Int) -> Int? = {
x,y -> null
}
var canReturnNull: ((Int, Int) -> Int)? = null
// 함수타입 전체가 널이될 수 있음을 선언
fun twoAndThree(operation: (Int, Int) -> Int) {
val result = operation(2, 3)
println("result : $result")
}
twoAndThree({x, y -> x + y})
인자로 받은 함수를 호출하는 구문은 일반 함수를 호출하는 방법과 같다.
fun String.filter(predicate: (Char) -> Boolean): String {
val sb = StringBuilder()
for(index in 0 until length){
val element = get(index)
if(predicate(element)){ // predicate 인자로 전달된 함수를 호출한다.
sb.append(element)
}
}
return sb.toString()
}
"abcd".filter { it in 'a'..'z'} // 람다를 predicate 인자로 전달한다.
함수형 프로그래밍
순수 함수를 조합해 상태 데이터 변경이나 부작용이 없는 루틴을 만들어 내며 람다식(이름 없는 함수)를 이용해 함수를 변수처럼 매개변수, 인자 ,반환값 등에 활용하는 고차 함수를 구성해 생산성을 높이는 프로그래밍 방법이다.
람다 식과 고차함수를 이용하면서 다양한 함수의 조합을 사용할 수 있다. 이는 간략한 표현식으로 직결되고 생산성이 높아진다.