少し違う問題がありました。forEachでローカル変数をインクリメントする代わりに、オブジェクトをローカル変数に割り当てる必要がありました。
これを解決するには、反復したいリスト(countryList)とそのリストから取得したい出力(foundCountry)の両方をラップするプライベート内部ドメインクラスを定義します。次に、Java 8の「forEach」を使用して、リストフィールドを反復処理し、目的のオブジェクトが見つかったら、そのオブジェクトを出力フィールドに割り当てます。したがって、これはローカル変数自体を変更するのではなく、ローカル変数のフィールドに値を割り当てます。ローカル変数自体は変更されていないので、コンパイラーは文句を言わないと思います。次に、リストの外の出力フィールドで取得した値を使用できます。
ドメインオブジェクト:
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;
}
}
ラッパーオブジェクト:
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;
}
}
反復操作:
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());
ラッパークラスメソッド "setCountryList()"を削除して、フィールド "countryList"をfinalにすることはできますが、これらの詳細をそのままにしておくと、コンパイルエラーは発生しませんでした。