[groovy] Groovy “각”폐쇄에서 벗어날 수 있습니까?

breakGroovy에서 가능 .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
    }
  }

그것은 나를 위해 작동합니다!


답변