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

时间:2012-05-28 09:48:08

标签: groovy

我有一个从Web服务器下载文件的功能,有时会提供空集合。在函数中,我在该集合上调用每个函数,我期望发生的是函数只是退出,每个闭包都没有运行。问题是它确实运行了一个空的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 个答案:

答案 0 :(得分:11)

没有,所以我假设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的东西首先不添加空值

修改

实际上,听起来你有一个带有空字符串的List ......

findAll修补程序仍然可以正常工作,因为在Groovy Truth下空字符串计算为false

编辑2

快速说明一下,你可能会改变:

def fos = new FileOutputStream( new File( targetDir, filename ) )
...

为:

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

它会ensure the stream is closed给你: - )