java-ee - JAVA8 lambdas表達(dá)式 改變外面變量的值
問題描述
如圖,我在外部定義了一個(gè)etotalPrice,然后再兩個(gè)for循環(huán)里想要改變這個(gè)值,結(jié)果給我報(bào)錯(cuò)了,該怎么解決?(NumberUtil.add和mutiplyu是基礎(chǔ)的+*保留2位小數(shù)的方法)
問題解答
回答1:在Java的經(jīng)典著作《Effective Java》、《Java Concurrency in Practice》里,大神們都提到:匿名函數(shù)里的變量引用,也叫做變量引用泄露,會(huì)導(dǎo)致線程安全問題,因此在Java8之前,如果在匿名類內(nèi)部引用函數(shù)局部變量,必須將其聲明為final,即不可變對(duì)象。
Java8這里加了一個(gè)語法糖:在lambda表達(dá)式以及匿名類內(nèi)部,如果引用某局部變量,則直接將其視為final。
建議你重構(gòu)一下這段代碼:使用lambda返回一個(gè)值,賦給外面的變量。
回答2:意思是totalPrice在lambada表達(dá)式中,應(yīng)該是final類型,final類型初始化后就不可以改變了,所以再次給totalPrice賦值會(huì)錯(cuò)誤。所以應(yīng)該重新定義一個(gè)變量保存新的值,而不是再次將值復(fù)制給totalPrice,如果改變變量不可以,就不要使用lambada表達(dá)式。
回答3:final 的,當(dāng)然不可變啦。如果必須要變就不要用lambda,用lambda就別修改值
相關(guān)文章:
1. docker images顯示的鏡像過多,狗眼被亮瞎了,怎么辦?2. docker網(wǎng)絡(luò)端口映射,沒有方便點(diǎn)的操作方法么?3. css - 微信小程序點(diǎn)擊展開,再次點(diǎn)擊收回4. 點(diǎn)擊頁面就自動(dòng)輸入到mysql.求解5. node.js - angular.js高級(jí)程序設(shè)計(jì)書本開頭配置環(huán)境出錯(cuò),誰能給解答一下6. javascript - react-native 里面onPress函數(shù)不能直接寫帶參數(shù)的函數(shù)7. node.js - 求問nw.js開發(fā)桌面版,其js計(jì)算性能如何?8. javascript - web 移動(dòng)端瀏覽器 用js 能不做判斷當(dāng)前手機(jī)安裝沒安裝app 如果安了就去打開 沒安就去下載哇?9. java - springboot 修改默認(rèn)靜態(tài)資源文件讀取路徑10. Java:密碼包(加密和解密)。無效的密鑰錯(cuò)誤
