Groovy println然后从关闭中断开

时间:2014-10-23 12:48:51

标签: java groovy closures

我有以下简单的groovy脚本,我理解在阅读here后无效。但我现在的问题是为什么这不会退出关闭。有人可以提供解释或指向讨论闭包的文档。谢谢

def inputFile = new File("input.txt")
inputFile.eachLine{ it ,i ->
  if(it.contains("abcd")){
    println "abcd found on line: " + i
    return true
  }
}

2 个答案:

答案 0 :(得分:2)

eachLine中运行的基本伪代码是:

while (true) {
    def line = readLineFromFile()
    if (line==null) {
        break
    }
    closure(line, count++)
}

所以除了文件的结尾之外没有其他任何东西可以停止。闭包中的return有效,但它只从闭包返回

有关详细信息,请参阅org.codehaus.groovy.runtime.IOGroovyMethods.eachLine的来源。

闭包不是whilefor等语言构造。它们只是通过上下文传递给匿名函数。如果你把它写出来,它会变得更加清晰,代码实际意味着什么(没有常规的快捷方式):inputFile.eachLine({it,i->...})(请注意方法调用中的()(

一般来说:groovy中的each.*并不关心你的结果。关闭中的回报只意味着提前纾困(在你的情况下,这是一个无操作)。

因此,对于一般问题,您可以break来自封闭吗? “没有”。 Iff你的调用者以任何方式使用闭包的结果,状态,...来允许你从中断(例如[].find():迭代列表,直到闭包返回是,然后返回元素),你不能(你可以抛出异常)。

答案 1 :(得分:1)

Groovy的each*方法不会退出循环,如果你确实返回了" body"。他们只是取消了这个实体的执行,然后转到下一个实体。

相反,"发现"方法如果闭包返回true,则立即返回。

你可以使用forwhile的普通循环,或者(不推荐)让你的闭包抛出异常