Tôi có lớp sau đây:Java 8 suối để tìm phần tử trong danh sách
public class Item {
int id;
String name;
// few other fields, contructor, getters and setters
}
Tôi có một danh sách các mục. Tôi muốn lặp qua danh sách và tìm cá thể có một id cụ thể. Tôi đang cố gắng làm điều đó thông qua các luồng.
public void foobar() {
List<Item> items = getItemList();
List<Integer> ids = getIdsToLookup();
int id, i = ids.size() - 1;
while (i >= 0) {
id = ids.get(i);
Optional<Item> item = items
.stream()
.filter(a -> a.getId() == id)
.findFirst();
// do stuff
i--;
}
}
Đây có phải là cách tốt nhất để lặp qua danh sách và lấy yếu tố tôi cần không? Ngoài ra, tôi nhận được một lỗi trên dòng lọc cho id mà nói rằng các biến được sử dụng trong các biểu thức lambda phải là cuối cùng hoặc hiệu quả cuối cùng. Có lẽ tôi có thể định nghĩa id bên trong vòng lặp while, điều đó sẽ loại bỏ ngoại lệ. Cảm ơn.
Bạn đang sử dụng cùng biến i cho chỉ mục trong danh sách và cho mục hiện tại trong lambda. Chọn một tên khác. Mã đó là tốt, nhưng khá kém hiệu quả. Nếu bạn có nhiều id và cần tìm mục tương ứng cho tất cả, hãy bắt đầu bằng cách tạo HashMap, và sau đó sử dụng HashMap. –
Tôi đang sử dụng một biến khác trong mã của mình, tôi đã cố gắng đơn giản hóa mã ở đây. Tôi sẽ thay đổi nó. –
Khai báo biến 'id' ** bên trong ** vòng lặp và nó sẽ có hiệu quả cuối cùng. Bằng cách ở bên ngoài, bạn khởi động lại nó ở mỗi lần lặp lại, và do đó không phải là cuối cùng. Việc khai báo các biến trong phạm vi nhỏ nhất có thể là một cách thực hành tốt nhất nói chung. –