java-ee - JAVA8 lambdas表達(dá)式 改變外面變量的值
問(wèn)題描述
如圖,我在外部定義了一個(gè)etotalPrice,然后再兩個(gè)for循環(huán)里想要改變這個(gè)值,結(jié)果給我報(bào)錯(cuò)了,該怎么解決?(NumberUtil.add和mutiplyu是基礎(chǔ)的+*保留2位小數(shù)的方法)
問(wèn)題解答
回答1:在Java的經(jīng)典著作《Effective Java》、《Java Concurrency in Practice》里,大神們都提到:匿名函數(shù)里的變量引用,也叫做變量引用泄露,會(huì)導(dǎo)致線程安全問(wèn)題,因此在Java8之前,如果在匿名類內(nèi)部引用函數(shù)局部變量,必須將其聲明為final,即不可變對(duì)象。
Java8這里加了一個(gè)語(yǔ)法糖:在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 for Mac 創(chuàng)建的dnsmasq容器連不上/不工作的問(wèn)題2. docker安裝后出現(xiàn)Cannot connect to the Docker daemon.3. css - 定位為absolute的父元素中的子元素 如何設(shè)置在父元素的下面?4. javascript - angualr2中emit觸發(fā)一個(gè)方法然后怎么獲得這個(gè)promise的結(jié)果5. java - 請(qǐng)問(wèn)在main方法中寫成對(duì)象名.屬性()并賦值,與直接參參數(shù)賦值輸錯(cuò)誤是什么原因?6. mysql里的大表用mycat做水平拆分,是不是要先手動(dòng)分好,再配置mycat7. java - Spring boot 讀取 放在 jar 包外的,log4j 配置文件,系統(tǒng)有創(chuàng)建日志文件,不寫入日志信息。8. javascript - 圖片鏈接請(qǐng)求一直是pending狀態(tài),導(dǎo)致頁(yè)面崩潰,怎么解決?9. python - beautifulsoup獲取網(wǎng)頁(yè)內(nèi)容的問(wèn)題10. 怎么用css截取字符?
