15

鉴于 Groovy 没有 do-while 语句,我如何遍历输入流中的所有字节?

根据Groovy 用户指南的先前版本

还没有'do ... while()' 语法。

由于模棱两可,我们尚未向 Groovy 添加对 do .. while 的支持

在 Groovy 中执行以下 Java 代码的最佳方法是什么?

def numRead = inputStream.read(fileBytes, 0, fileBytes.length);
do{

} while(numRead > 0);

(我知道我可以使用布尔值来做到这一点,我只是想知道是否有“Groovy”的方式来做到这一点)

4

3 回答 3

19

我知道这是一个古老且已经回答的问题。但这是谷歌搜索时弹出的“groovy do while”的第一个。

我认为 Groovy 中一般可观的 do-while同义词可能是:

while ({
    ...

    numRead > 0
}()) continue

请考虑上面的例子。除了一些“冗余”括号外,它的语法可读性相当好。

它是如何工作的:

  1. while条件圆括号内,闭包定义为大括号打开
  2. 闭包在花括号关闭后与内圆括号对内联执行
  3. 闭包内最后一行的值是当为假时将打破循环的值(它是从闭包返回的)
  4. continue在 while 条件结束圆括号之后只是因为必须有“某物”,任何可编译的语句。例如,它可能是0,但continue似乎更适合。

编辑:不确定它是新版本的 Groovy 还是我之前错过了。相反continue,分号也可以。然后它就像:

while ({
    ...

    numRead > 0
}());
于 2014-02-27T02:10:04.617 回答
14

groovy(1.8+ 版)的方式是这样的:

inputStream.eachByte(BUFFER_SIZE) { buffer, numRead ->
    ...
}
于 2011-11-18T20:50:20.820 回答
2

用这个:

for(;;){ // infinite for
    ...

    if( numRead == 0 ){ //condition to break, oppossite to while 
        break
    }
}
于 2014-01-24T18:43:05.963 回答