【问题标题】:Groovy println then break from closure [duplicate]Groovy println 然后从关闭中中断[重复]
【发布时间】:2025-11-26 11:50:02
【问题描述】:

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

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

【问题讨论】:

  • 这里有一个很好的解释:*.com/questions/3049790/…
  • 是的,我实际上刚刚读过这篇文章,我现在要编辑我的问题。我还是想知道为什么会这样

标签: java groovy closures


【解决方案1】:

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

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

因此,除了文件末尾之外,没有什么可以停止的。您在闭包中的 return 有效,但它只返回 from 闭包。

详情见org.codehaus.groovy.runtime.IOGroovyMethods.eachLine的来源。

闭包不是像whilefor 这样的语言结构。它们只是在带有上下文的匿名函数中传递。如果你把它写出来,代码的实际含义会更清楚(没有 groovy 快捷方式):inputFile.eachLine({it,i->...})(请注意此处方法调用中的 ())

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

所以对于一般性问题,您可以 break 关闭闭包吗? “不”。如果您的调用者以任何方式处理闭包的结果、状态...以允许您从中中断(例如 [].find() 会:迭代列表,直到闭包返回 true,然后返回元素),你不能(你可以抛出异常)。

【讨论】:

    【解决方案2】:

    Groovy 的each* 方法不会退出循环,如果您确实返回它的“主体”。他们只是取消了这个body实例的执行,然后继续下一个。

    相反,如果闭包返回 true,“find”方法会立即返回。

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

    【讨论】: