2012-01-10 34 views
13

Có cách nào để loại bỏ một mục Groovy trong khi đang lặp lại không? Trong Java này được thực hiện sử dụng Iterator.remove():Groovy loại bỏ mục Bộ sưu tập trong khi đang lặp lại

Collection collection = ... 
for (Iterator it=collection.iterator(); it.hasNext();) { 
    Object obj = it.next(); 
    if (should remove) { 
     it.remove(); 
    } 
} 

Liệu Groovy cung cấp loại bỏ-khi-lặp lại trong cú pháp ngôn ngữ của nó, hay tôi đã làm sử dụng Iterator.remove()?

Trả lời

23

Use removeAll().

> c = [1, 2, 3, 4, 5] 
> c.removeAll { it % 2 == 0 } 
> println c 
[1, 3, 5] 

Bạn hỏi cụ thể về "khi đang lặp", bạn đang cố gắng thực hiện điều gì đó với/quá từng đối tượng? removeAll vẫn hoạt động càng lâu càng tuyên bố cuối cùng của việc đóng cửa vẫn là truthy/falsey (như trước đây):

> c.removeAll { 
*  tmp = it * 10 
*  println "ohai ${it}*10=${tmp}" 
*  tmp >= 40 
* } 
ohai 1*10=10 
ohai 2*20=20 
ohai 3*30=30 
ohai 4*40=40 
ohai 5*50=50 
> println c 
[1, 2, 3] 

của việc đóng cửa giá trị trả về (giá trị của báo cáo kết quả cuối cùng, hoặc một return giá trị rõ ràng) là truthy/falsey, nó sẽ được sử dụng để xác định những gì cần được loại bỏ. Nó không cần phải tham chiếu một cách rõ ràng cho từng đối tượng.

+2

Rất tuyệt vời !!! Tôi không biết về .removeAll {} –

+1

@JarredOlson Nếu bạn chưa quen với Groovy, tôi khuyên bạn nên kiềm chế bản thân không làm các vòng lặp dựa trên vòng lặp thủ công (hoặc 'cho ()' cho vòng lặp). Với các phương thức dựa trên đóng cửa như 'each',' collect', 'findAll', v.v ... Tôi chưa bao giờ có nhu cầu sử dụng các trình lặp lặp rõ ràng trong Groovy, và đó là một sự cứu trợ lớn = D – epidemian

+0

@epidemian Tôi không phải là mới, chỉ không biết về .removeAll {} và tôi nghĩ nó rất tuyệt :) Tôi sẽ lặp lại các câu lệnh của bạn mặc dù trong đó sử dụng các phương thức trên Bộ sưu tập là những cách rất tốt để làm quen với các bao đóng/Groovy. –

Các vấn đề liên quan