加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-14 16:32:39 所属栏目:大数据 来源:网络整理
导读:我有一个从Web服务器下载文件的功能,有时会提供空集合.在函数中,我在该集合上调用每个函数,我期望发生的是函数只是退出,每个闭包都没有运行.问题是,它确实运行了一个空的文件名参数,并且FileOutputStream的创建在它被提供目录而不是文件时变得繁荣. def get(
我有一个从Web服务器下载文件的功能,有时会提供空集合.在函数中,我在该集合上调用每个函数,我期望发生的是函数只是退出,每个闭包都没有运行.问题是,它确实运行了一个空的文件名参数,并且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表现得像这样,我应该怎么做呢?

解决方法

它没有,所以我假设文件包含一些东西(比如null?)

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

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

假设它在你的文件列表中是空的,导致问题,你可以通过以下方式摆脱它们:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读