Lambda表達式中需要修改外部變量(Java)


在java開發中常會使用到Lambda表達式的使用,但如果想在Lambda表達式中更改外部的變量,程序並不不會報錯,但修改只在Lambda表達式中才有效。

直接上結論,要想解決這個問題,要么把這個外部變量定義為是全局的數組,要么這個變量是某個具體實例化類的成員。

我首次遇到這個問題就是在已經封裝好的項目中,去實現具體的邏輯,但前人都是用lambda表達式寫的。我就只能去百度得到的結果是

“lambda 表達式接受外部變量是通過copy副本的方式,所以編譯器要求不能修改該變量值或則引用值,如果要修改可以通過集合或則實體類包裝的方式實現。”


根據知乎的高贊回答,我總算是理解了這個設計方法,(參考鏈接貼出來了哦,我只是轉述的)

應該是設計上縮水了。這個地方應該實現一個閉包的語義,編譯器需要把閉包的對象引用傳給內部類。但java實現時沒有傳引用,而是直接copy了數據。也就是里外兩個變量實際上是兩個名字和值相同,但各自獨立的東西。如果該數據在內部類的函數里可以修改,就會出現里外不一致,於是會露餡。因此java干脆規定這種變量必須是final的,不能改。


因為項目的特殊性,局限性,選擇方法就及其有限,而且我的eclipse還不報錯debug了半天才發現這個錯誤。於是果斷改用全局數組變量。

解決方法已經說了,下面是我具體遇到的問題具體代碼的具體代碼

用一個全局變量記錄房間號碼

因為尋找房間的具體操作的在Lambda表達式中的,所以要記錄下來只能用全局變量

然后再調用該全局變量來使用

參考回答(https://www.zhihu.com/question/361639494)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM