2011-11-18 4 views
13

Dato che Groovy non ha un'istruzione do-while, come posso eseguire l'iterazione su tutti i byte in un flusso di input?Come faccio a ripetere tutti i byte in un inputStream usando Groovy, dato che manca di un'istruzione Do-While?

Per un previous version of the Groovy user guide:

No 'do ... while()' la sintassi ancora.

causa di ambiguità, che abbiamo non è ancora aggiunto il supporto per do .. mentre per Groovy

Quale sarebbe il modo migliore per fare qualcosa di simile il seguente codice Java in Groovy?

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

} while(numRead > 0); 

(so che posso farlo con un valore booleano, voglio solo sapere se c'è un modo "Groovy" di farlo)

+0

migliore risposta da Tim yates: http://stackoverflow.com/questions/20921546/elegant-way-for-do-while-in-groovy –

risposta

13

The Groovy (versione 1.8+) modo sarebbe come questo :

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

Grazie, esattamente quello che stavo cercando per. – talnicolas

+0

@ataylor Come posso applicare questo metodo a un altro scenario in cui "BUFFER_SIZE' è noto solo all'interno del ciclo? Semplicemente, non conosco il valore di "BUFFER_SIZE' senza andare all'interno del ciclo. –

2

uso questo:

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

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

so che è un vecchio e già risposto alla domanda. Ma è il primo che appare per "groovy do while" quando su google.

Penso generale considerevole do-while sinonimo in Groovy potrebbe essere:

while ({ 
    ... 

    numRead > 0 
}()) continue 

Si prega di prendere in considerazione l'esempio di cui sopra. Tranne alcune parentesi 'ridondanti' è sintassi piuttosto ben leggibile.

Ed ecco come funziona:

  1. all'interno della condizione while rotonda Staffe chiusura viene definito con parentesi graffa aperta
  2. chiusura viene eseguito in linea con interno pair parentesi dopo parentesi graffa close
  3. valore dell'ultima riga all'interno della chiusura è il valore che interromperà il ciclo quando falso (viene restituito dalla chiusura)
  4. continue dopo condizione chiusura staffa tonda è solo perché ci deve essere "qualcosa", qualsiasi dichiarazione compilabile. Ad esempio potrebbe essere 0, anche se continue sembra adattarsi molto meglio.

EDIT: Non è sicuro che sia una versione più recente di Groovy o che mi sia sfuggita prima. Invece verrà effettuato anche il punto e virgola continue. Poi va come:

while ({ 
    ... 

    numRead > 0 
}()); 
+2

Questo è abbastanza bello ed elegante, grazie! – jk47