2015-09-11 47 views
10

Tôi đang cố gắng để thực hiện 100 nhiệm vụ tất cả song song qua Chấp hành viên và Runnable, nhiệm vụ cần phải sử dụng biến vòng lặp:Sử dụng biến vòng lặp không chính thức bên trong một biểu thức lambda

for (int i = 0; i < 100; i++) { 
    executor.execute(() -> { 
    doSomething(String.format("Need task number %d done", i)); 
    } 
    }); 
} 

tôi nhận được một nguệch ngoạc dưới 'i' nói - Variable used in lambda expression should be effectively final.

Biến vòng lặp, theo như tôi biết, không thể được thực hiện cuối cùng hoặc hiệu quả cuối cùng, vì nó đang được thay đổi với mỗi lần lặp. Tôi đã tìm thấy một giải pháp đơn giản,

for (int i = 0; i < 100; i++) { 
    int index = i; 
    executor.execute(() -> { 
    doSomething(String.format("Need task number %d done", index)); 
    } 
}); 
} 

Đây không phải là giải pháp hiệu quả nhất đối với tôi, tuyên bố biến mới trong mỗi lần lặp lại. Có cách nào tốt hơn để làm điều này?

+0

Đây là biến địa phương, vì vậy tôi nghĩ rằng nó không thực sự quan trọng – ka4eli

+0

@ ka4eli - đồng ý. Hiệu suất-khôn ngoan nó không quan trọng. JVM rất có thể sẽ chỉ xóa nó và sử dụng 'i' trực tiếp. Yêu cầu cuối cùng hiệu quả chỉ được thực thi bởi javac, vì lợi ích của các lập trình viên. Thời gian chạy chỉ đơn giản là nắm bắt giá trị hiện tại. – ZhongYu

+0

@ bayou.io rất thú vị, tôi không nghĩ đến việc tối ưu hóa JVM. – Siddhartha

Trả lời

12

Có cách nào tốt hơn để thực hiện việc này không?

Tôi nghi ngờ điều đó. giải pháp của bạn có vẻ tốt đẹp đối với tôi, nhưng nếu bạn muốn, bạn có thể viết lại nó thành mã có thể rõ ràng hơn như:

IntStream.range(0, 100).forEach(
    i -> executor.execute(
     () -> doSomething(String.format("Need task number %d done", i)) 
    ) 
); 
+0

Đây là ngắn gọn và tuyệt vời. Tôi sẽ sử dụng nó. Cảm ơn rất nhiều. – Siddhartha

2

Đó là cách đơn giản nhất để làm cho nó hoạt động. Bạn sẽ không làm tốt hơn thế.

+2

đồng ý. trừ khi nếu chúng ta có một số «Iterable ' - 'cho (int i: range (0, 100))' - ở đây 'i' sẽ có hiệu quả cuối cùng. – ZhongYu

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