2011-11-18 18 views
13

Cho rằng Groovy không có câu lệnh do-while, làm cách nào tôi có thể lặp qua tất cả các byte trong luồng đầu vào?Làm cách nào để lặp qua tất cả các byte trong một inputStream bằng Groovy, vì nó thiếu một câu lệnh do-while?

mỗi một previous version of the Groovy user guide:

Không 'do ... while()' cú pháp như được nêu ra.

Do sự mơ hồ, chúng tôi đã chưa thêm hỗ trợ cho việc phải làm .. thời gian để Groovy

Điều gì sẽ là cách tốt nhất để làm điều gì đó giống như mã Java sau trong Groovy?

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

} while(numRead > 0); 

(Tôi biết tôi có thể làm điều đó bằng cách sử dụng boolean, tôi chỉ muốn biết nếu có một "Groovy" cách để làm việc đó)

+0

Better câu trả lời bởi Tim Yates: http://stackoverflow.com/questions/20921546/elegant-way-for-do-while-in-groovy –

Trả lời

13

Các groovy (phiên bản 1.8+) cách sẽ là như thế này :

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

Cảm ơn, chính xác những gì tôi đang tìm kiếm cho. – talnicolas

+0

@ataylor Làm cách nào tôi có thể áp dụng phương thức này cho một tình huống khác trong đó 'BUFFER_SIZE' chỉ được biết bên trong vòng lặp? Đơn giản, tôi không biết giá trị của 'BUFFER_SIZE' mà không đi vào vòng lặp. –

2

sử dụng này:

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

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

tôi biết đó là một câu hỏi cũ và đã được trả lời. Nhưng đó là lần đầu tiên những gì bật lên cho 'groovy làm trong khi' khi googled.

Tôi nghĩ chung đáng kể do-while từ đồng nghĩa trong Groovy có thể là:

while ({ 
    ... 

    numRead > 0 
}()) continue 

Hãy xem xét ví dụ trên. Ngoại trừ một số ngoặc 'dư thừa', đó là cú pháp khá dễ đọc.

Và dưới đây là cách nó hoạt động:

  1. bên trong tình trạng while vòng ngoặc đóng cửa được xác định với khung nhọn mở
  2. việc đóng cửa được thực hiện inline với nội cặp dấu ngoặc tròn sau khung xoăn gần
  3. giá trị của dòng cuối cùng bên trong đóng là giá trị sẽ phá vỡ vòng lặp khi sai (nó được trả về từ việc đóng)
  4. continue sau khi điều kiện đóng khung tròn chỉ bởi vì phải có 'cái gì đó', bất kì lời tuyên bố nào. Ví dụ: có thể là 0, mặc dù continue dường như phù hợp hơn nhiều.

EDIT: Không chắc chắn đó là phiên bản mới hơn của Groovy hay tôi đã bỏ lỡ điều đó trước đây. Thay vào đó, continue dấu chấm phẩy cũng sẽ hoạt động. Sau đó, nó đi như thế:

while ({ 
    ... 

    numRead > 0 
}()); 
+2

Điều này là khá mát mẻ và thanh lịch, cảm ơn! – jk47