break
Groovy에서 가능 .each{Closure}
합니까, 아니면 클래식 루프를 사용해야합니까?
답변
아니요, 예외를 발생시키지 않고 “각”을 중단 할 수는 없습니다. 특정 조건에서 중단을 중단하려면 클래식 루프가 필요할 수 있습니다.
또는 각각 대신 “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
답변
교체 각 을 가진 루프 어떤 폐쇄.
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
답변
아니요, 예외를 발생시키지 않으면 서 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
그밖에
거짓을 돌려 주다
답변
에 의해 중단 될 수 RETURN
있습니다. 예를 들어
def a = [1, 2, 3, 4, 5, 6, 7]
def ret = 0
a.each {def n ->
if (n > 5) {
ret = n
return ret
}
}
그것은 나를 위해 작동합니다!