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所说,你不能抛弃方法而不抛出和捕捉异常.虽然我认为在流量控制名称中抛出和捕获异常是一种代码气味,而程序员可能会拍打你的手.
你可以抛出异常:
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)
尝试使用任何而不是每个
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
| 归档时间: |
|
| 查看次数: |
28226 次 |
| 最近记录: |