람다 식(lamda expression) 또는 람다는 기본적으로 다른 함수에 넘길 수 있는 작은 코드 조각을 뜻한다.
람다가 없다면 컬렉션을 편리하게 처리할 수 있는 라이브러리를 제공하기 힘들다. 자바에선 컬렉션 라이브러리가 적었으며, 필요한 컬렉션 기능을 집적 작성했다고 한다.
data class Person(val name: String, val age: Int)
val people = listOf(
Person("Ailice", 29),
Person("Bob", 31)
)
println(people.maxBy() { it.age } )
위 코드를 람다를 사용한 경험이 없다면, loop를 사용해서 구현했을 것이다.
모든 컬렉션에 대해서 maxBy
함수를 호출할 수 있다.
<aside>
💡 maxBy
는 가장 큰 원소를 찾기 위해 비교에 사용할 값(it.age)을 함수의 인자로 받는다.
</aside>
maxBy
처럼 함수나, 프로퍼티를 반환하는 역할을 수행하는 람다는 멤버 참조로 대치할 수 있다.
people.maxBy(Person::age) // 함수나 프로퍼티를 반환할 경우만 사용가능
이렇게 멤버참조를 사용하면 더 짧고, 이해하기 쉽다.
람다는 값처럼 여기저기 전달할 수 있는 동작의 모음이다. 람다를 따로 선언해서 변수에 저장할 수도 있다.
{ x: Int, y: Int -> x + y }
**파라미터** 본문
코틀린 람다 식은 항상 중광호로 둘러싸여 있다. 인자 목록 주변에 괄호()가 없다는 사실을 기억하자.
화살표( → )가 인자 목록과 람다 본문을 구분해준다.
val sum = { x: Int, y: Int -> x + y }
prinln(sum(1, 2)) // 변수에 저장된 람다를 호출한다.
run {
println("result : ")
print(sum(1, 2))
}
코드의 일부분을 블록으로 둘러싸 실행할 피요거 있다면 run
을 사용한다. 이는 인자로 받은 람다를 실행해주는 함수이다.
코틀린이 코드를 줄여 쓸 수 있게 제공했던 기능을 제거하고, 람다로 Person예제를 작성해보면 다음과 같다.
peple.maxBy { p: Person -> p.age }
val maxAge = { p: Person -> p.age }
people.maxBy(maxAge)
중괄호 안에 있는 코드는 람다 식( p: Person -> p.age
)이고 해당 식을 maxBy함수에 넘긴다.