람다 식(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함수에 넘긴다.