답변:
아니요, 예외를 발생시키지 않고 "각"을 중단 할 수는 없습니다. 특정 조건에서 중단을 중단하려면 클래식 루프가 필요할 수 있습니다.
또는 각각 대신 "find"클로저를 사용하고 휴식을 취했을 때 true를 반환 할 수 있습니다.
이 예제는 전체 목록을 처리하기 전에 중단됩니다.
def a = [1, 2, 3, 4, 5, 6, 7]
a.find {
if (it > 5) return true // break
println it // do the stuff that you wanted to before break
return false // keep looping
}
인쇄물
1
2
3
4
5
6 또는 7을 인쇄하지 않습니다.
클로저를 받아들이는 커스텀 브레이크 동작으로 자신 만의 반복자 메서드를 작성하는 것도 정말 쉽습니다.
List.metaClass.eachUntilGreaterThanFive = { closure ->
for ( value in delegate ) {
if ( value > 5 ) break
closure(value)
}
}
def a = [1, 2, 3, 4, 5, 6, 7]
a.eachUntilGreaterThanFive {
println it
}
또한 인쇄합니다 :
1
2
3
4
5
find
보다 더 any
- 아래에 다른 대답을 참조 @Michal에서 해당 나를 위해 하나 개의 작품
def test = [2] test.findResult{ it * 2 }
2 대신 4를 반환합니다
교체 각 을 가진 루프 어떤 폐쇄.
def list = [1, 2, 3, 4, 5]
list.any { element ->
if (element == 2)
return // continue
println element
if (element == 3)
return true // break
}
산출
1
3
any()
이 방법으로 사용 하는 것은 약간 오도되지만 확실히 작동하며 중단 하거나 계속할 수있는 기능을 제공합니다 .
아니요, 예외를 발생시키지 않으면 서 Groovy의 폐쇄에서 벗어날 수 없습니다. 또한 제어 흐름에 예외를 사용해서는 안됩니다.
자신이 클로저에서 벗어나기를 원한다면, 아마도 왜 이것을하고 싶은지 아닌 어떻게해야하는지 생각해야합니다. 가장 먼저 고려해야 할 것은 Groovy의 (개념적인) 고차 함수 중 하나로 문제의 클로저를 대체하는 것일 수 있습니다. 다음 예제는
for ( i in 1..10) { if (i < 5) println i; else return}
된다
(1..10).each{if (it < 5) println it}
된다
(1..10).findAll{it < 5}.each{println it}
명확성에 도움이됩니다. 그것은 코드의 의도를 훨씬 더 잘 나타냅니다.
표시된 예제의 잠재적 인 단점은 첫 번째 예제에서 반복 만 중지한다는 것입니다. 성능 고려 사항이있는 경우 즉시 중지하고 싶을 수 있습니다.
그러나 반복이 수반되는 대부분의 유스 케이스의 경우 일반적으로 Groovy의 찾기, grep, 수집, 주입 등의 방법 중 하나를 사용할 수 있습니다. 그들은 일반적으로 "설정"을 한 다음 반복을 수행하는 방법을 "알아"가능하므로 가능한 곳에서는 명령 적 루핑을 실제로 피할 수 있습니다.
특별한 폐쇄 만 사용
// declare and implement:
def eachWithBreak = { list, Closure c ->
boolean bBreak = false
list.each() { it ->
if (bBreak) return
bBreak = c(it)
}
}
def list = [1,2,3,4,5,6]
eachWithBreak list, { it ->
if (it > 3) return true // break 'eachWithBreak'
println it
return false // next it
}
(1..10). 각 {
경우 (it <5)
그것을 println
그밖에
거짓을 돌려 주다
each
4에서 else
벗어나지 않고 단순히 4보다 큰 값을 인쇄하지 않습니다. 불필요합니다. 또한, 증명할 수 each
와 휴식하지 않습니다 return false
당신이 세우면 println "not breaking"
후 바로 else
직전 return false
.
에 의해 중단 될 수 RETURN
있습니다. 예를 들어
def a = [1, 2, 3, 4, 5, 6, 7]
def ret = 0
a.each {def n ->
if (n > 5) {
ret = n
return ret
}
}
그것은 나를 위해 작동합니다!
any
을 반환하여 배열의 메소드를 중단 할 수 있습니다 false
. each
같은 방법으로 메소드를 중단 할 수 없습니다 .