Tôi đã có một vấn đề hơi khác nhau. Thay vì tăng một biến cục bộ trong forEach, tôi cần gán một đối tượng cho biến cục bộ.
Tôi đã giải quyết điều này bằng cách xác định một lớp miền bên trong riêng tư bao bọc cả danh sách mà tôi muốn lặp lại (countryList) và kết quả đầu ra mà tôi hy vọng nhận được từ danh sách đó (foundCountry). Sau đó, sử dụng Java 8 "forEach", tôi lặp qua trường danh sách và khi đối tượng tôi muốn được tìm thấy, tôi gán đối tượng đó cho trường đầu ra.Vì vậy, điều này gán một giá trị cho một trường của biến cục bộ, không thay đổi biến cục bộ. Tôi tin rằng vì biến cục bộ không bị thay đổi, trình biên dịch không phàn nàn. Sau đó tôi có thể sử dụng giá trị mà tôi đã chụp trong trường đầu ra, bên ngoài danh sách.
miền Object:
public class Country {
private int id;
private String countryName;
public Country(int id, String countryName){
this.id = id;
this.countryName = countryName;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCountryName() {
return countryName;
}
public void setCountryName(String countryName) {
this.countryName = countryName;
}
}
đối tượng Wrapper:
private class CountryFound{
private final List<Country> countryList;
private Country foundCountry;
public CountryFound(List<Country> countryList, Country foundCountry){
this.countryList = countryList;
this.foundCountry = foundCountry;
}
public List<Country> getCountryList() {
return countryList;
}
public void setCountryList(List<Country> countryList) {
this.countryList = countryList;
}
public Country getFoundCountry() {
return foundCountry;
}
public void setFoundCountry(Country foundCountry) {
this.foundCountry = foundCountry;
}
}
Lặp hoạt động:
int id = 5;
CountryFound countryFound = new CountryFound(countryList, null);
countryFound.getCountryList().forEach(c -> {
if(c.getId() == id){
countryFound.setFoundCountry(c);
}
});
System.out.println("Country found: " + countryFound.getFoundCountry().getCountryName());
Bạn có thể loại bỏ các phương pháp lớp wrapper "setCountryList()" và làm cho lĩnh vực này "countryList" cuối cùng, nhưng tôi đã không nhận được lỗi biên dịch để lại những chi tiết này.
Nguồn
2017-09-03 21:13:05
lỗi biên dịch là gì? Vui lòng bao gồm điều đó trong câu hỏi của bạn và xem liệu bạn có thể thu hẹp mã ví dụ của mình xuống để bạn có thể bao gồm định nghĩa lớp hoàn chỉnh hay ít nhất là định nghĩa phương thức hoàn chỉnh, sao chép lỗi đó. –
Xem xét lambdas về cơ bản là cú pháp đường cho một lớp bên trong vô danh, trực giác của tôi là không thể nắm bắt một biến cục bộ không phải là cuối cùng. Tôi rất muốn được chứng minh là sai. – Sinkingpoint
Một biến được sử dụng trong một biểu thức lambda phải có hiệu quả cuối cùng. Bạn có thể sử dụng một số nguyên nguyên tử mặc dù nó quá mức cần thiết, do đó, một biểu thức lambda không thực sự cần thiết ở đây. Chỉ cần gắn bó với vòng lặp. –