Tuve un problema ligeramente diferente. En lugar de incrementar una variable local en forEach, necesitaba asignar un objeto a la variable local.
Resolví esto definiendo una clase de dominio interno privado que envuelve tanto la lista sobre la que quiero iterar (countryList) como la salida que espero obtener de esa lista (foundCountry). Luego, usando Java 8 "forEach", itero sobre el campo de lista, y cuando se encuentra el objeto que quiero, asigno ese objeto al campo de salida. Entonces esto asigna un valor a un campo de la variable local, sin cambiar la variable local en sí. Creo que dado que la variable local en sí no se cambia, el compilador no se queja. Luego puedo usar el valor que capturé en el campo de salida, fuera de la lista.
Objeto de 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;
}
}
Objeto envoltorio:
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;
}
}
Operación iterativa:
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());
Puede eliminar el método de la clase contenedora "setCountryList ()" y hacer que el campo "countryList" sea final, pero no obtuve errores de compilación dejando estos detalles como están.