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

私はそれが古くてすでに答えられた質問であることを知っています。しかし、それはグーグルで「groovydowhile」のためにポップアップする最初のものです。

Groovyの一般的なかなりのdo-while同義語は次のようになると思います。

while ({
    ...

    numRead > 0
}()) continue

上記の例を考えてみてください。いくつかの「冗長な」括弧を除いて、それはかなり読みやすい構文です。

そして、これがどのように機能するかです:

  1. 条件の内側のwhile丸括弧は、中括弧が開いた状態でクロージャが定義されます
  2. 中かっこを閉じた後、閉じかっこは内側の丸かっこペアとインラインで実行されます
  3. クロージャー内の最後の行の値は、falseの場合にループを中断する値です(クロージャーから返されます)
  4. continue丸括弧を閉じる条件が「何か」でなければならないという理由だけで、コンパイル可能なステートメントがあります。たとえば、それは可能性がありますが0continueはるかに適しているようです。

編集:それがGroovyの新しいバージョンなのか、それとも私が以前にそれを見逃したのかはわかりません。代わりにcontinue、セミコロンも同様に機能します。次に、次のようになります。

while ({
    ...

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

グルーヴィーな(バージョン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 に答える