Ho avuto un problema leggermente diverso. Invece di incrementare una variabile locale in forEach, avevo bisogno di assegnare un oggetto alla variabile locale.
Ho risolto questo problema definendo una classe di dominio interno privato che racchiude sia l'elenco su cui desidero iterare (countryList) sia l'output che spero di ottenere da tale elenco (foundCountry). Quindi, utilizzando Java 8 "forEach", itero sul campo elenco e quando viene trovato l'oggetto che desidero, assegno quell'oggetto al campo di output. Quindi questo assegna un valore a un campo della variabile locale, senza modificare la variabile locale stessa. Credo che poiché la variabile locale stessa non viene modificata, il compilatore non si lamenta. Posso quindi utilizzare il valore che ho catturato nel campo di output, al di fuori dell'elenco.
Oggetto dominio:
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;
}
}
Oggetto 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;
}
}
Operazione ripetuta:
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());
Potresti rimuovere il metodo della classe wrapper "setCountryList ()" e rendere finale il campo "countryList", ma non ho ricevuto errori di compilazione lasciando questi dettagli così come sono.