Ich hatte ein etwas anderes Problem. Anstatt eine lokale Variable in forEach zu erhöhen, musste ich der lokalen Variablen ein Objekt zuweisen.
Ich habe dieses Problem gelöst, indem ich eine private innere Domänenklasse definiert habe, die sowohl die Liste, über die ich iterieren möchte (countryList), als auch die Ausgabe, die ich von dieser Liste erhalten möchte (foundCountry), umschließt. Dann iteriere ich mit Java 8 "forEach" über das Listenfeld, und wenn das gewünschte Objekt gefunden wird, ordne ich dieses Objekt dem Ausgabefeld zu. Dadurch wird einem Feld der lokalen Variablen ein Wert zugewiesen, ohne dass die lokale Variable selbst geändert wird. Ich glaube, da sich die lokale Variable selbst nicht ändert, beschwert sich der Compiler nicht. Ich kann dann den Wert verwenden, den ich im Ausgabefeld außerhalb der Liste erfasst habe.
Domänenobjekt:
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;
}
}
Wrapper-Objekt:
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;
}
}
Iterierte Operation:
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());
Sie könnten die Wrapper-Klassenmethode "setCountryList ()" entfernen und das Feld "countryList" endgültig machen, aber ich habe keine Kompilierungsfehler erhalten, wenn diese Details unverändert bleiben.