代码之家  ›  专栏  ›  技术社区  ›  Jack BeNimble

groovy-如何退出每个循环?

  •  23
  • Jack BeNimble  · 技术社区  · 15 年前

    我对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
    
        }
    
    
    
       }
      }
    
    4 回复  |  直到 10 年前
        1
  •  41
  •   Community CDub    8 年前

    你不能做得优雅。你可能会看到一些人建议抛出一个例外,但那只是 plain ugly .

    这里有一些 mailing list discussion 使用时 each VS for 有几个人这么说 对于 首选原因是 每个 无法从迭代中突破。

    你最好的办法是换成 对于 循环和迭代:

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

    或者像你说的那样,也许可以用 find findAll 要查找您要查找的元素(以下代码已解释,我还没有时间测试它):

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

    相关销售代表问题:

        2
  •  5
  •   Michal Zmuda    11 年前

    替换 每个 循环带 任何 找到 关闭。

    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
  •  4
  •   Community CDub    8 年前

    关于每个回路的断开,请参见: is it possible to 'break' out of a groovy closure

    基本上,你必须抛出异常并捕获它。“break”关键字只能在循环内使用,而不能重复使用“closures”(真正的代码块)。

    您可以将任何复杂的代码与“find”一起使用,只要确保您调用的函数返回一个布尔值即可。例如:

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

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

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