return, label, this Kotlin


기본 형식

data class Person(val name: String, val age: Int)

fun lookForAlice1(people: List<Person>) {
for (person in people) {
if (person.name == "Alice") {
println("Found!")
return
}
}
println("Alice is not found")
}

fun a() {
val people = listOf(Person("Alice", 29), Person("Bob", 31))
lookForAlice1(people)
}
forEach로 변경했을 때


fun lookForAlice2(people: List<Person>) {
people.forEach {
if (it.name == "Alice") {
println("Found!")
return
}
}
println("Alice is not found")
}
람다로 묶여있지만 람다내의 리턴이 아닌 람다를 포함한 함수에서 리턴함
논로컬 리턴이라 부름
-> 이 람다가 인라인이기 때문임

label 사용

fun lookForAlice2(people: List<Person>) {
people.forEach label@{
if (it.name == "Alice") {
println("Found!")
return@label
}
}
println("Alice is not found")
}
함수 이름을 label로 설정할 수 있음
fun lookForAlice2(people: List<Person>) {
people.forEach {
if (it.name == "Alice") {
println("Found!")
return@forEach
}
}
println("Alice is not found")
}

return과 별개로 this에도 label을 사용할 수 있음
println(StringBuilder().apply sb@{
listOf(1, 2, 3).apply {
this@sb.append(this.toString())
}
})

무명함수: 로컬 리턴이 되게
무명함수는 이름이 없고 파라미터 형식을 생략

fun lookForAlice3(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)



덧글

댓글 입력 영역