Miałem nieco inny problem. Zamiast zwiększać lokalną zmienną w forEach, musiałem przypisać obiekt do zmiennej lokalnej.
Rozwiązałem to, definiując prywatną klasę domeny wewnętrznej, która otacza zarówno listę, którą chcę iterować (countryList), jak i dane wyjściowe, które mam nadzieję uzyskać z tej listy (foundCountry). Następnie używając Java 8 „forEach”, iteruję po polu listy, a kiedy szukany obiekt zostanie znaleziony, przypisuję ten obiekt do pola wyjściowego. Więc to przypisuje wartość do pola zmiennej lokalnej, nie zmieniając samej zmiennej lokalnej. Uważam, że skoro sama zmienna lokalna nie jest zmieniana, kompilator nie narzeka. Następnie mogę użyć wartości, którą przechwyciłem w polu wyjściowym, poza listą.
Obiekt domeny:
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;
}
}
Obiekt opakowania:
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;
}
}
Operacja iteracyjna:
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());
Możesz usunąć metodę klasy opakowania „setCountryList ()” i nadać polu „countryList” ostateczną wartość, ale nie otrzymałem błędów kompilacji, pozostawiając te szczegóły bez zmian.