람다 안의 return문: 람다를 둘러싼 함수에서 반환
- 람다 안에서 return → 그 람다를 호출한 함수의 실행이 종료되고 반환됨
- return이 선언된 람다를 호출한 함수를 반환하게 만드는 return 문을 “비로컬 return”이라고 함
data class Person(val name: String, val age: Int)
val people = listOf(Person("Alice", 29), Person("Bob", 31))
fun lookForAlice(people: List<Person>) {
people.forEach {
if(it.name == "Alice"){
println("Found!")
return
}
}
println("Alice is not found")
}
- return이 바깥 블록을 반환시키는 경우 → 인라인 함수에서만 가능
람다로부터 반환: 레이블을 사용한 return
this 식의 레이블
- 수신 객체 지정 람다 → this로 수신 객체 지정 (13장 내용)
- 수신 객체 지정 람다 앞에 레이블을 붙인 경우 this 뒤에 그 레이블을 붙여 수신객체를 지정할 수 있음
fun main() {
println(StringBuilder().apply sb@{
listOf(1, 2, 3).apply {
this@sb.append(this.toString())
}
})
}
익명 함수 : 기본적으로 로컬 return
- 익명 함수 → 람다를 정의하는 또 다른 방법
- 익명 함수에서 return을 쓰면 기본적으로 로컬 return임
fun findForAlice(people: List<Person>) {
people.forEach(fun (person) {
if(person.name == "Alice") return
println("${person.name} is not Alice")
})
}
- 함수 이름 생략
- 파라미터 타입을 컴파일러가 추론해줌
people.filter (fun (person): Boolean {
return person.age < 30
})
people.filter(fun (person) = person.age < 30)
- 식을 본문으로 사용할 수 있음
- 식을 본문으로 사용할 경우 반환 타입은 생략할 수 있음
return은 가장 가까운 fun 키워드를 반환시킴
