嘗試使用非Final 時出現錯誤訊息“Lambda 表達式中使用的變數應該是Final 或有效Final” lambda 表達式中的變數。此要求確保捕獲的變數的不變性。
在提供的程式碼片段中:
private TimeZone extractCalendarTimeZoneComponent(Calendar cal, TimeZone calTz) { ... cal.getComponents().getComponents("VTIMEZONE").forEach(component -> { ... if (calTz == null) { calTz = TimeZone.getTimeZone(v.getTimeZoneId().getValue()); } }); ... }
變數 calTz 在 lambda 表達式中使用,且不具有保證的最終狀態。這違反了 lambda 表達式只能捕捉最終變數或實際上最終變數的規則。
為什麼要製定此規則? Java 語言規格 (JLS) 在第 15.27.2 節中解釋說,它阻止存取動態變更的局部變量,從而緩解並發問題。透過確保捕獲的變數是不可變的,該語言降低了錯誤的風險。
此要求也適用於匿名內部類別。此類中使用的變數也必須是最終的或有效最終的,以確保線程安全。
以上是為什麼 Lambda 表達式需要 Final 或有效 Final 變數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!