【问题标题】:Groovy - how to exit each loop?Groovy - 如何退出每个循环?
【发布时间】:2010-12-18 12:36:47
【问题描述】:

我是 Grails/Groovy 的新手,正在尝试在 xml 文件中查找节点;我已经想出了如何遍历所有这些,但是我想在找到目标节点时退出循环。我已经读过,而不是使用“每个”,而是使用“查找”,但我看到的查找示例是条件。现在我的逻辑是遍历整个文件而不退出。代码如下:

  records.children().each {domain ->
   println "domain_name: " + domain.@domain_name
   if (domain.@domain_name == targetDomain) {
    
    println "target domain matched: " + domain.@domain_name
        
    domain.children().each {misc_field ->
     
     println "field_name: " + misc_field.@field_name
     println "field_type: " + misc_field.@field_type
     println "field_value: " + misc_field
     
    }
   }
  }

【问题讨论】:

    标签: xml grails groovy


    【解决方案1】:

    你不能优雅地做到这一点。您可能会看到有人建议抛出异常,但这只是plain ugly

    这里有一些关于使用eachformailing list discussion,有几个人说for 是首选,因为each 无法摆脱迭代。

    您最好的选择可能是切换到 for 循环并迭代:

    for(def domain : records.children()) { // this may need some tweaking depending on types
        // do stuff
        if(condition) {
            break;
        }
    }
    

    要么,或者像你说的那样,也许使用findfindAll 来找到你正在寻找的元素(以下代码被解释,我还没有时间测试它):

    def result = records.children().find { domain -> domain.@domain_name == targetDomain }
    result.children().each {
        // print stuff
    }
    

    相关的 SO 问题:

    【讨论】:

    • 但是在杰克原来的问题中,他甚至需要破解吗?在我看来,意图是(在伪常规中,因为我从未使用过它)records.children.find(@domain_name = targetDomain).children().each (println)
    • @neonski - 是的,我只是在编辑我的答案,就像你解释的那样。我认为这可能是更理想的解决方案。
    • @Jack - 你能澄清哪一个有效吗(为了未来的读者)?如果不是find 解决方案,您也可以尝试一下,只是为了体验。这更像是一个时髦的解决方案。
    • 当然 - 我实际上是在刷新 cmets 之前发布了答案。我使用了第一个解决方案。我尝试了第二个,但编译器在“=”符号处显示“意外令牌”:@domain_name = targetDomain.
    • +1 在这种情况下使用 Find。它很简洁,我发现使用 Find 或 FindAll 非常方便,并且使代码易于理解和测试。
    【解决方案2】:

    anyfind 闭包替换 each 循环。

    def list = [1, 2, 3, 4, 5]
    list.any { element ->
        if (element == 2)
            return // continue
    
        println element
    
        if (element == 3)
            true // break
    }
    

    输出

    1
    3
    

    【讨论】:

      【解决方案3】:

      关于打破每个循环,请参阅:is it possible to 'break' out of a groovy closure

      基本上你必须抛出异常并捕获它。 “break”关键字只允许在循环中使用,而不是迭代“闭包”(真正的代码块)。

      您可以通过“查找”使用任何复杂的代码,只需确保您调用的函数返回一个布尔值。例如:

      Boolean test(val) {
          println "Testing $val"
          return val == 1
      }
      
      def found = [3,4,5,1,6,3].find { test(it) }
      
      println "Found $found"

      【讨论】:

        【解决方案4】:

        我认为这也应该有效,在第一场比赛就停止。

        def result = records.children().find { domain -> 
            if (domain.@domain_name == targetDomain) {
                // Do stuff
                ...
                return true
            } else {
                return false
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-11-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-18
          • 2012-11-04
          相关资源
          最近更新 更多