[Kotlin] 4-2. 고차 함수와 람다

고차 함수와 람다

람다 식의 개요

고차 함수의 예

val doubled = ints.map { value -> value*2 }

함수를 호출할 때 인자가 람다뿐이면 괄호를 완전히 생략할 수 있다

it: 단일 파라미터의 암묵적 이름

다른 유용한 한 가지 규칙은 함수 리터럴의 파라미터가 한 개면,(->를 포함한) 파라미터 선언을 생략할 수 있고, 파라미터 이름이 it이 된다는 것이다

ints.map { it*2 }

이 규칙은 LINQ-방식 코드를 작성할 수 있게 한다

strings.filter { it.length == 5 }.sortedBy{ it }.map{ it.toUpperCase() }

사용하지 않는 변수의 밑줄 표기

람다의 파라미터를 사용하지 않으면 이름 대신에 밑줄을 사용할 수 있다

map.forEach{ _, value -> println("$value") }

람다 식과 익명 함수

람다 식 또는 익명 함수는 선언 없이 바로 식으로 전달한 함수인 “함수 리터럴”이다

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

max함수는 고차 함수로서 번째 인자로 함수 값을 취한다. 두 번째 인자는 자체가 함수인 식으로 함수 리터럴이다. 다음 함수와 동등하다

fun compare(a: String, b: String): Boolean = a.length < b.length

람다 식 구문

람다 식(함수 타입의 리터럴)의 완전한 구문 형식은 다음과 같다

val sum = {x: Int, y: Int -> x+y}

람다 식은 항상 중괄호로 감싼다. 완전한 구문 형식에서 파라미터 선언은 중괄호 안에 위치하고 선택적으로 타입을 표시한다. 몸체는 -> 부호 뒤에 온다. 람다의 추정한 리턴 타입이 Unit 이 아니면 람다 몸체의 마지막(또는 단일) 식을 리턴 값으로 처리한다.

모든 선택 사항을 생략하면 람다 식은 다음과 같이 보인다

val sum: (Int, Int) -> Int = {x, y -> x+y}

익명 함수

fun(x: Int, y: Int): Int = x+y

클로저

람다 식 또는 익명 함수(그리고 로컬 함수 와 오브젝트 식)은 그것의 클로저에, 즉 외부 범위에 선언된 변수에 접근할 수 있다. 자바와 달리 클로저에 캡처한 변수를 수정 할 수 있다

var sum = 0
ints.filter {it > 0}.forEach {
  sum += it
}
print(sum)