ich ein etwas anderes Problem hatte zu zitieren. Anstatt eine lokale Variable im forEach zu inkrementieren, musste ich der lokalen Variablen ein Objekt zuweisen.
Ich löste dies, indem ich eine private innere Domain-Klasse definiere, die sowohl die Liste, über die ich iterieren möchte (countryList), als auch die Ausgabe, die ich von dieser Liste bekomme (foundCountry), umschließt. Dann iteriere ich mit Java 8 "forEach" über das Listenfeld, und wenn das gewünschte Objekt gefunden wird, weise ich dieses Objekt dem Ausgabefeld zu.Damit wird einem Feld der lokalen Variablen ein Wert zugewiesen, ohne die lokale Variable selbst zu ändern. Ich glaube, da die lokale Variable selbst nicht geändert wird, beschwert sich der Compiler nicht. Ich kann dann den Wert verwenden, den ich im Ausgabefeld außerhalb der Liste erfasst habe.
Domain Objekt:
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;
}
}
Iterate Betrieb:
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-Klasse-Methode "setCountryList()" entfernen und das Feld machen "countryList" final, aber ich habe keine Kompilierungsfehler erhalten, die diese Details unverändert lassen.
Was ist der Compiler-Fehler? Fügen Sie das bitte in Ihre Frage ein und prüfen Sie, ob Sie Ihren Beispielcode eingrenzen können, damit Sie eine vollständige Klassendefinition oder zumindest eine vollständige Methodendefinition einbeziehen können, die den Fehler reproduziert. –
Wenn man bedenkt, dass lambdas im Wesentlichen syntaktischer Zucker für eine anonyme innere Klasse sind, ist meine Intuition, dass es unmöglich ist, eine nicht finale, lokale Variable zu erfassen. Ich würde mich aber gerne irren. – Sinkingpoint
Eine in einem Lambda-Ausdruck verwendete Variable muss effektiv final sein. Sie können eine atomare Ganzzahl verwenden, obwohl sie übertrieben ist, daher wird hier kein Lambda-Ausdruck benötigt. Bleib einfach bei der For-Schleife. –