Eu tive um problema um pouco diferente. Em vez de incrementar uma variável local em forEach, precisei atribuir um objeto à variável local.
Resolvi isso definindo uma classe de domínio interno privado que envolve a lista que desejo iterar (countryList) e a saída que espero obter dessa lista (foundCountry). Em seguida, usando Java 8 "forEach", itero sobre o campo de lista e, quando o objeto que desejo é encontrado, atribuo esse objeto ao campo de saída. Portanto, isso atribui um valor a um campo da variável local, não alterando a própria variável local. Acredito que, como a variável local em si não é alterada, o compilador não reclama. Posso então usar o valor que capturei no campo de saída, fora da lista.
Objeto de domínio:
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 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;
}
}
Operação de iteração:
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());
Você poderia remover o método da classe wrapper "setCountryList ()" e tornar o campo "countryList" final, mas não recebi erros de compilação deixando esses detalhes como estão.