为什么对于空集合中的每个闭包至少运行一次?

8

我有一个从Web服务器下载文件的函数,有时会接收到空集合。在函数中,我对该集合调用每个元素,我期望发生的是函数只是退出,并且不运行each闭包。问题是当使用空的filename参数运行时,它确实被运行了,而且当它被传递一个目录而不是一个文件时,FileOutputStream的创建就会失败。

def get(String baseUrl, List files, String targetDir) {
    files.each { filename ->
    // Goes BOOM on next line
    def fos = new FileOutputStream(targetDir + File.separator + filename)
    ...
}

为什么Groovy会有这样的行为,我应该怎么做呢?
1个回答

10

这并非如此,因此我认为files包含某些内容(比如null?)

[].each {
  println "boom"  // This doesn't appear
}

[null].each {
  println "pow!"  // this does
}

假设您的文件列表中有 null,导致了问题,您可以通过以下方式解决:
files.findAll().each { filename ->
  def fos = new FileOutputStream( new File( targetDir, filename ) )
  ...

当然,也可以让生成List的部分一开始就不添加null值。
编辑:
实际上,听起来你有一个包含空字符串的List... findAll修复仍然有效,因为空字符串在Groovy Truth下会被评估为false
编辑2:
简要说明一下,你可能需要更改:
def fos = new FileOutputStream( new File( targetDir, filename ) )
...

to:

new File( targetDir, filename ).withOutputStream { fos ->
  ...

这将确保流被关闭,为您服务 :-)


太棒了(像往常一样),明天回到工作岗位后我会试一下! - Fylke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接