2011-11-18 12 views
13

Dado que Groovy no tiene una declaración do-while, ¿cómo puedo iterar sobre todos los bytes en una secuencia de entrada?¿Cómo iterar sobre todos los bytes en un inputStream usando Groovy, dado que carece de una declaración do-while?

por un previous version of the Groovy user guide:

No 'do ... while()' sintaxis que todavía.

Debido a la ambigüedad, todavía no hemos añadido soporte para hacer .. mientras que maravilloso

¿Cuál sería la mejor manera de hacer algo como el siguiente código Java en el maravilloso?

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

} while(numRead > 0); 

(sé que puedo hacer que el uso de un valor lógico, sólo quiero saber si hay una manera de "maravilloso" de hacerlo)

+0

mejor respuesta por Tim yates: http://stackoverflow.com/questions/20921546/elegant-way-for-do-while-in-groovy –

Respuesta

13

El maravilloso (versión 1.8+) forma sería como esto :

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

Gracias, exactamente lo que estaba buscando para. – talnicolas

+0

@ataylor ¿Cómo puedo aplicar este método a otro escenario donde 'BUFFER_SIZE' solo se conoce dentro del ciclo? Simplemente, no sé el valor de 'BUFFER_SIZE' sin entrar al ciclo. –

2

uso esto:

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

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

sé que es un viejo y ya respondido a la pregunta. Pero es el primero que aparece para 'groovy do while' cuando se busca en Google.

creo que en general considerable do-while sinónimo en Groovy podría ser:

while ({ 
    ... 

    numRead > 0 
}()) continue 

Por favor, considere el ejemplo anterior. Excepto algunos paréntesis "redundantes", es una sintaxis bastante fácil de leer.

Y aquí es cómo funciona:

  1. dentro de la condición while ronda soportes de un cierre se define con el corchete abierto
  2. el cierre es ejecutado en línea con paréntesis interno par después de corchete cerca
  3. valor de la última línea dentro del cierre es el valor que romperá el bucle cuando sea falso (se devuelve desde el cierre)
  4. continue después de la condición de cierre del soporte redondo es solo porque tiene que haber 'algo', cualquier declaración compilable. Por ejemplo, podría ser 0, aunque continue parece encajar mucho mejor.

EDITAR: No estoy seguro de si es una versión más reciente de Groovy o me he perdido antes. En su lugar continue punto y coma también lo hará. A continuación, va como:

while ({ 
    ... 

    numRead > 0 
}()); 
+2

Esto es genial y elegante, gracias! – jk47

Cuestiones relacionadas