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?
Đâ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
@ 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
@ bayou.io rất thú vị, tôi không nghĩ đến việc tối ưu hóa JVM. – Siddhartha