람다
- 다른 함수에 넘기거나 반환 받을 수 있는 작은 코드 조각
// 함수의 인자, 반환 타입 지정
val codeFragment: (Int, Int) -> Int = { x, y -> x + y //함수의 본문 지정
}
- 이미 함수로 만들어진 기능을 인자로 넘기고 싶다면 차라리 맴버 참조를 사용하라 (EX : class::method )
- 코틀린 람다는 람다 바깥의 변수를 변경 할 수 있다. 다만 val 변수는 복사해서 가져온다
- 지연(lazy) 컬렉션 연산
- 시퀀스를 이용하여 중간 임시 컬렉션을 만들지 않고 연산 시킬 수 있다
"".asSequece().filter{ it > 124 }.map { it.toInt }
- 요소가 매우 많은 컬렉션에 대해서만 사용하라
- 단순 반복 연산에는 사용하지 말 것
- 시퀀스 연산에서는 람다가 인라이닝 되지 않기 때문에 기본적인 성능이 더 나쁘다
- 람다에서의 this 는 그 람다를 둘러싼 객체의 인스턴스를 가르킨다
- 수신 객체 지정 람다
- 수신 객체를 명시하지 않고 람다 안에서 객체의 메소드를 호출하는 방법
- 코틀린에서는 with와 apply가 존재한다
fun String.a() = get(1)
- 위와 같은 확장 함수에서 String 는 수신 객체 타입 , 함수 본문에 쓰이는 this 를 수신 객체라 한다
- 고차 함수와 인라인 함수
- 람다에서 바깥 변수를 사용하는 경우 매번 새로운 람다 객체가 생성되므로 주의해야 한다 → 이 때는 inline을 사용하라
- 람다는 함수 인자를 인라이닝하면 이익이 더 많다
- 자신을 둘러싼 블록보다 더 바깥의 다른 블록을 반환하는 Return을 Non-Local Return이라 부르며 람다는 기본적으로 Non-Local Return이다
- 람다식에서는
@label 을 이용한 Local Return을 지원한다
- 람다와 달리 무명 함수는 기본적으로 Local Return이다