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. javascript - QQ第三方登錄的問題2. 前端 - @media query 使用出現(xiàn)的問題?3. docker 下面創(chuàng)建的IMAGE 他們的 ID 一樣?這個(gè)是怎么回事????4. node.js - mongodb查找子對(duì)象的名稱為某個(gè)值的對(duì)象的方法5. 運(yùn)行python程序時(shí)出現(xiàn)“應(yīng)用程序發(fā)生異常”的內(nèi)存錯(cuò)誤?6. html5 - datatables 加載不出來數(shù)據(jù)。7. 測(cè)試自動(dòng)化html元素選擇器元素ID或DataAttribute [關(guān)閉]8. 利用IPMI遠(yuǎn)程安裝centos報(bào)錯(cuò)!9. javascript - 在 model里定義的 引用表模型時(shí),model為undefined。10. spring-mvc - spring-session-redis HttpSessionListener失效

網(wǎng)公網(wǎng)安備