是否有可能在groovy中突破关闭

26 groovy

有没有办法从一个时髦的封闭中"打破".

也许是这样的:

[1, 2, 3].each { 
  println(it)
  if (it == 2)
    break 
}
Run Code Online (Sandbox Code Playgroud)

小智 22

我经常忘记Groovy实现了"任何"方法.

[1, 2, 3].any
{   
   println it
   return (it == 2)
}?
Run Code Online (Sandbox Code Playgroud)


Ben*_*err 14

12/05/2013严重编辑.

回答被问到的问题.

是否有可能突破关闭?

你可以通过发出关键字来"破解"一个闭包return.但是,这在给出的示例中没有帮助.这样做的原因是闭包(将其视为方法)由each方法为集合中的每个项调用.

如果您运行此示例,您将看到它将打印1然后3.

[1, 2, 3].each {
  if (it == 2) return
  println(it)
}
Run Code Online (Sandbox Code Playgroud)

为什么break在上下文each中没有意义.

要理解为什么你不能突破这个each方法,就像你可以突破for循环一样,你需要了解一些实际发生的事情.这是对集合中每个方法的粗略简化.

myEach([0,1,3])

void myEach(List things) {
    for (i in things) {
        myEachMethod(i)
    }
}

void myEachMethod(Object it) { // this is your Closure
    if(it == 2) return
    println it
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,闭包基本上是一种可以传递的方法.就像在java中一样,你不能在方法调用或闭包中中断.

做什么而不是打破each.

在Groovy中,您应该使用高级抽象来表达您的代码,因为这样的原始循环不是惯用的.对于您给出的示例,我会考虑使用findAll.例如:

[1,2,3].findAll { it < 2 }.each { println it }
Run Code Online (Sandbox Code Playgroud)

我希望这可以帮助您了解正在发生的事情.

回答隐含的问题.

你能否突破Collection.each你提供的闭包的迭代?

each正如John Wagenleitner所说,你不能抛弃方法而不抛出和捕捉异常.虽然我认为在流量控制名称中抛出和捕获异常是一种代码气味,而程序员可能会拍打你的手.


Joh*_*ner 8

你可以抛出异常:

try {
    [1, 2, 3].each { 
        println(it)
        if (it == 2)
            throw new Exception("return from closure") 
    }
} catch (Exception e) { }
Run Code Online (Sandbox Code Playgroud)

使用也可以使用"findAll"或"grep"过滤掉你的列表,然后使用"each".

[1, 2, 3].findAll{ it < 3 }.each{ println it }
Run Code Online (Sandbox Code Playgroud)

  • 您是否同意使用Exceptions控制流量操作通常被认为是一个糟糕的选择或代码味道? (9认同)

Rob*_*anu 8

看一下最佳模式,模拟常规闭包中的继续进行广泛的讨论.


Pha*_* VU 7

尝试使用任何而不是每个

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

结果:1,2,3