J'ai eu un problème légèrement différent. Au lieu d'incrémenter une variable locale dans forEach, j'avais besoin d'assigner un objet à la variable locale.
J'ai résolu ce problème en définissant une classe de domaine interne privé qui englobe à la fois la liste sur laquelle je veux parcourir (countryList) et la sortie que j'espère obtenir de cette liste (foundCountry). Ensuite, en utilisant Java 8 "forEach", j'itère sur le champ de liste, et lorsque l'objet que je veux est trouvé, j'attribue cet objet au champ de sortie. Ainsi, cela affecte une valeur à un champ de la variable locale, sans modifier la variable locale elle-même. Je crois que puisque la variable locale elle-même n'est pas modifiée, le compilateur ne se plaint pas. Je peux ensuite utiliser la valeur que j'ai capturée dans le champ de sortie, en dehors de la liste.
Objet de domaine:
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;
}
}
Objet 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;
}
}
Opération itérative:
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());
Vous pouvez supprimer la méthode de classe wrapper "setCountryList ()" et rendre le champ "countryList" final, mais je n'ai pas eu d'erreurs de compilation en laissant ces détails tels quels.