Intro

대부분의 언어에서 람다를 아주 강력하고 편리한 도구라고 한다.

(자바 8에서 람다가 나오기 이전까지, 자바 개발자들은 매일 람다 노래를 불렀다고 한다..)

람다는 도대체 뭐길래 그렇게 편리하고, 모두가 원하는 인기쟁이일까?

람다?

람다 식(lambda expression) 또는 람다는 다른 함수에 넘길 수 있는 작은 코드 블록을 뜻한다.

람다는 익명 함수와 함께 대표적인 함수 리터럴이다.

⇒ 람다, 함수 리터럴, 클로저를 서로 혼용하는 일이 많다.

람다 식의 구조

기본적인 람다 식의 구조와 규칙은 다음과 같다.

  1. 람다 식은 중괄호로 묶는다.

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

  2. 함수의 맨 뒤에 있는 인자가 람다 식이라면 그 람다를 괄호 밖으로 빼낼 수 있다.

    val product = items.fold(1) { acc, e -> acc * e }

  3. 람다 식이 함수의 유일한 인자라면 빈 괄호를 생략할 수 있다.

    people.maxBy { p: Person -> p.age }

    사용하지 않는 인자는 통상적으로 _으로 명명한다.

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

  4. 컴파일러가 추론할 수 있는 타입은 생략할 수 있다.

    people.maxBy { p -> p.age }

    ⇒ 람다를 변수에 저장할 때와 같이 파라미터 타입을 추론할 수 없는 경우, 필수적으로 명시

  5. 람다의 파라미터가 하나뿐이고, 컴파일러가 추론할 수 있는 경우 인자 및 타입 선언 없이 it을 바로 쓸 수 있다.

    people.maxBy { it.age }

  6. 본문이 여러 줄인 경우, 마지막에 있는 식이 람다의 결과 값이 된다.

  7. 람다를 함수 안에 정의하면 함수의 파라미터뿐 아니라 함수의 로컬 변수까지 사용할 수 있다.

    ⇒ 자바와 달리 final변수가 아닌 변수에 접근할 수 있고, 변경도 가능하다

람다의 사용

람다가 없었던 버전(자바 8 이전)의 코드와 람다 지원 이후의 코드를 통해 람다가 얼마나 편리한지 확인해보자.

// 자바 8 이전
button.setOnClickListener(new onClickListener() {
    @Override
    public void onClick(View v) {
        ...
    }
})

// 자바 8 이후
button.setOnClickListener { view -> ... }