如何使用Groovy迭代所有输入流中的字节,考虑到它缺少do-while语句?

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”的方法可以实现)


Tim Yates的更好答案:https://dev59.com/9mEi5IYBdhLWcg3w0fBR - biniam
3个回答

19

我知道这是一个老问题并且已经有答案了。但当在谷歌上搜索“groovy do while”时,这是第一个弹出来的。

我认为在Groovy中一般可考虑使用do-while作为同义词:

while ({
    ...

    numRead > 0
}()) continue
请考虑以上示例。除了一些“冗余”的括号,它的语法相当易读。
以下是它的工作方式:
1. 在 while 条件圆括号内定义一个带有大括号开头的闭包。 2. 在大括号结束后,内部圆括号对内联执行该闭包。 3. 闭包中最后一行的值将作为 false 时中断循环的值(从闭包中返回)。 4. 在 while 条件关闭圆括号后的 continue 只是因为必须有“某些”可编译语句。例如,它可以是 0,但 continue 似乎更合适。
编辑:不确定这是 Groovy 的新版本还是我之前错过了。然后就像这样使用分号:continue
while ({
    ...

    numRead > 0
}());

14

用 Groovy(1.8 或更高版本)的方式会是这样的:

inputStream.eachByte(BUFFER_SIZE) { buffer, numRead ->
    ...
}

@ataylor 我如何将此方法应用于另一种情况,即 BUFFER_SIZE 仅在循环内已知的情况下?简单来说,如果不进入循环,我无法知道 BUFFER_SIZE 的值。 - biniam

2

使用这个:

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

    if( numRead == 0 ){ //condition to break, oppossite to while 
        break
    }
}

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