Senin örnekte, yerine forEachbasit ile lamdba ile fordöngü ve serbestçe herhangi bir değişkeni değiştirin. Veya, muhtemelen, herhangi bir değişkeni değiştirmeniz gerekmeyecek şekilde kodunuzu yeniden düzenleyin. Bununla birlikte, hatanın ne anlama geldiğini ve bunun üzerinden nasıl geçileceğini tamlık için açıklayacağım.
Java 8 Dil Spesifikasyonu, §15.27.2 :
Lambda ifadesinde kullanılan ancak bildirilmeyen herhangi bir yerel değişken, biçimsel parametre veya istisna parametresi ya son olarak bildirilmeli ya da etkin bir şekilde son olmalıdır ( §4.12.4 ), aksi takdirde kullanım denendiğinde bir derleme zamanı hatası oluşur.
Temel olarak, yerel bir değişkeni ( calTzbu durumda) bir lambda (veya yerel / anonim bir sınıf) içinden değiştiremezsiniz. Java'da bunu başarmak için, değiştirilebilir bir nesne kullanmanız ve onu (son değişken aracılığıyla) lambda'dan değiştirmeniz gerekir. Buradaki değişebilir bir nesneye bir örnek, bir öğeden oluşan bir dizi olabilir:
private TimeZone extractCalendarTimeZoneComponent(Calendar cal, TimeZone calTz) {
TimeZone[] result = { null };
try {
cal.getComponents().getComponents("VTIMEZONE").forEach(component -> {
...
result[0] = ...;
...
}
} catch (Exception e) {
log.warn("Unable to determine ical timezone", e);
}
return result[0];
}
calTzLambda'dan değiştiremezsiniz .