반응형
코틀린의 모든 블록은 라벨 설정이 가능하다.
그래서 return할 때 반환할 블록을 임의로 설정하여 여러가지 효과를 나타낼 수 있다.
case 1) 일반적인 return. 3을 만나면 forEach를 종료한다.
fun foo() {
listOf(1, 2, 3, 4, 5).forEach {
if (it == 3) return // non-local return directly to the caller of foo()
print(it)
}
println("this point is unreachable")
}
결과값
12this point is unreachable
case 2) forEach에 람다를 적용한다. 블록에 라벨을 설정하여 해당 블록만 반환하도록 변경. 3을 제외하고 다 출력
fun foo() {
listOf(1, 2, 3, 4, 5).forEach lit@{
if (it == 3) return@lit // local return to the caller of the lambda, i.e. the forEach loop
print(it)
}
print(" done with explicit label")
}
결과
1245 done with explicit label
case 3) forEach도 일종의 라벨이다. 따로 라벨 지정하지 않고 바로 forEach를 반환하도록 설정
fun foo() {
listOf(1, 2, 3, 4, 5).forEach {
if (it == 3) return@forEach // local return to the caller of the lambda, i.e. the forEach loop
print(it)
}
print(" done with implicit label")
}
>>
1245 done with implicit label
case 4) run은 익명함수처럼 쓸 수 있다. 결과적으로는 case1과 같은 효과를 내지만 명시적으로 아래와 같이 지정 가능. 물론 run 뒤에 라벨을 설정하여 쓸 수도 있다.
fun foo() {
run {
listOf(1, 2, 3, 4, 5).forEach(fun(value: Int) {
if (value == 3) return@run // local return to the caller of the anonymous fun, i.e. the forEach loop
print(value)
})
}
print(" done with anonymous function")
}
>>
12 done with anonymous function
반응형
댓글