2015-08-28 86 views
6

我試圖改變java8 forEach循環內的布爾變量爲true,這是非最終的。但是我得到以下錯誤:在封閉範圍內定義的本地變量必須是最終的或有效的最終。Java8有效最終編譯時間錯誤非最終變量

如何解決此錯誤?

代碼:

boolean required = false; 

這是我在函數創建的變量。

現在,當我試圖去改變它:

map.forEach((key, value) -> { 
     System.out.println("Key : " + key + " Value : " + value); 
     required = true; 
    }); 

我得到的錯誤:在一個封閉的範圍局部變量需要定義必須是最後的或有效的決賽。

爲什麼會出現此錯誤以及如何解決?

回答

6

您不能從lambda表達式的主體中更改局部變量。有幾種方法來解決這個問題:

  • 在你可以設置boolean required = !map.isEmpty();沒有任何lambda表達式這種特殊情況下。如果您想根據某些條件進行設置,則可以使用Stream API:

    boolean required = map.entrySet().stream().anyMatch(entry -> ...); 
    

    此解決方案是最受歡迎的。

  • required變量轉換爲封閉類的字段。

  • 最骯髒的方式:聲明一個元素的數組:boolean[] required = {false};和設置此元素代替:required[0] = true;
+1

像這樣:最骯髒的方式:聲明一個元素的數組:[]需要布爾= {假};並設置此元素:required [0] = true; 我其實想要做的事情,但你說它看起來很髒。是否有任何其他方式來更改lambda表達式中的局部變量@tagirValeev –

+3

@Siddharth,實際上沒有辦法改變局部變量。在'boolean [] required'的情況下,你不改變局部變量,而是改變堆對象。 –

+1

爲了增強我的知識,可以請你解釋一下你通過改變頭對象而不是改變局部變量來實際上是什麼意思。 @tagirValeev –