首页 文章

你能打破一个Groovy“每个”关闭?

提问于
浏览
133

是否可以从Groovy .each{Closure} break ,或者我应该使用经典循环?

6 回答

  • 10

    any closure替换 each 循环 .

    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
    
  • 47

    不,你不能在没有抛出异常的情况下中止“每个” . 如果您希望在特定条件下中断,则可能需要经典循环 .

    或者,您可以使用“查找”闭包而不是每个闭包,并在您休息时返回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
    
  • 2

    不,你不能在没有抛出异常的情况下从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的find,grep,collect,inject等方法 . 他们通常采取一些“配置”,然后“知道”如何为您进行迭代,这样您就可以尽可能避免命令性循环 .

  • -4

    只需使用特殊的Closure

    // 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
    }
    
  • -9

    (1..10) . 每个{

    如果(<5)

    打印出来

    其他

    返回false

  • 179

    你可以打破 RETURN . 例如

    def a = [1, 2, 3, 4, 5, 6, 7]
      def ret = 0
      a.each {def n ->
        if (n > 5) {
          ret = n
          return ret
        }
      }
    

    这个对我有用!

相关问题