Как перебрать все байты в inputStream с помощью Groovy, учитывая, что в нем отсутствует оператор do-while? - PullRequest
14 голосов
/ 19 ноября 2011

Учитывая, что Groovy не имеет оператора do-while, как я могу перебрать все байты входного потока?

За предыдущую версию руководства пользователя Groovy :

Синтаксиса do ... while () пока нет.

Из-за неоднозначности мы еще не добавили поддержку do .. while в Groovy

Каков наилучший способ сделать что-то вроде следующего кода Java в Groovy?

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

} while(numRead > 0);

(я знаю, что могу сделать это, используя логическое значение, я просто хочу знать, есть ли"Groovy" способ сделать это)

Ответы [ 3 ]

15 голосов
/ 27 февраля 2014

Я знаю, что это старый и уже отвеченный вопрос.Но это первое, что всплывает для «groovy do while», когда гуглится.

Я думаю, что общий значительный синоним do-while в Groovy может быть:

while ({
    ...

    numRead > 0
}()) continue

Пожалуйста, рассмотрите приведенный выше пример.За исключением некоторых «избыточных» скобок, это довольно хорошо читаемый синтаксис.

И вот как это работает:

  1. внутри круглых скобок условия while замыкание определяется фигурной скобкойopen
  2. замыкание выполняется встроенным с парой внутренних круглых скобок после закрытия фигурных скобок
  3. значение последней строки внутри замыкания - это значение, которое прервет цикл при ложном (возвращается иззакрытие)
  4. continue через некоторое время условие закрытия круглой скобки возникает только потому, что должно быть «что-то», любое скомпилируемое утверждение.Например, это может быть 0, хотя continue, кажется, подходит намного лучше.

РЕДАКТИРОВАТЬ: Не уверен, что это более новая версия Groovy или я пропустил это раньше.Вместо этого continue точка с запятой тоже подойдет.Тогда это выглядит так:

while ({
    ...

    numRead > 0
}());
13 голосов
/ 19 ноября 2011

Groovy (версия 1.8+) выглядит следующим образом:

inputStream.eachByte(BUFFER_SIZE) { buffer, numRead ->
    ...
}
2 голосов
/ 24 января 2014

используйте это:

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

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