[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)