日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

从lambda表达式看final关键字

發(fā)布時(shí)間:2025/3/12 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从lambda表达式看final关键字 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Variable used in lambda expression should be final or effectively final
想必大家在開(kāi)發(fā)java程序的時(shí)候應(yīng)該經(jīng)常見(jiàn)到。

這是因?yàn)樵趌ambda的匿名表達(dá)式里需要傳入final的對(duì)象,那么這是為什么呢?
因?yàn)閘ambda是匿名表達(dá)式,它是在新開(kāi)的一個(gè)線程中執(zhí)行的,如果它能夠修改局部變量的值,則會(huì)影響數(shù)據(jù)的一致性,所以必須傳入final的值或者一個(gè)數(shù)據(jù)副本。
注意后面的or effectively final,只要數(shù)據(jù)在定義之后被有被修改引用地址,那么它也是允許在lambda表達(dá)式中被調(diào)用(具有final的語(yǔ)義)。
這里用例子區(qū)分一下final對(duì)象、局部變量、實(shí)例變量的區(qū)別:

/*** @version 1.0*/ public class LambdaTest {Person person3 = new Person("實(shí)例變量");public void test() {List<String> list = new ArrayList<>();Person person1 = new Person("局部變量", "Male", new Date());person1 = new Person("ToryXu", "FeMale", new Date());//局部變量,并在定義之后修改了引用地址,報(bào)錯(cuò)CompletableFuture.runAsync(() -> {System.out.println(person1);});Person person2 = new Person("局部變量", "Male", new Date());//局部變量,并在定義之后沒(méi)有修改引用地址,具有final的語(yǔ)義,編譯器自動(dòng)加上final修飾符CompletableFuture.runAsync(() -> {System.out.println(person2);});//實(shí)例變量CompletableFuture.runAsync(() -> {System.out.println(person3);});final Person person4 = new Person("局部變量", "Male", new Date());//局部變量,本身就通過(guò)final修飾CompletableFuture.runAsync(() -> {System.out.println(person4);});}public static void main(String[] args) {new LambdaTest().test();} }

首先可以看到局部變量一定要用final修飾。
其次來(lái)看一下局部變量和實(shí)例變量到區(qū)別:
可以看到實(shí)例變量不用final修飾也是可以在lambda中被使用的。
個(gè)人理解:
這是因?yàn)榫植孔兞科湟玫刂反娣旁跅V?#xff0c;而棧是線程私有的,是不允許在lambda新開(kāi)的線程里去使用方法線程里的局部變量的。
而實(shí)例變量存放在堆中,是線程公有的,允許被不同個(gè)線程使用。
同時(shí)可知!
不是說(shuō)lambda表達(dá)式里的變量一定要被final修飾,而是表達(dá)式里的局部變量一定要被final修飾。
到了這里我有一個(gè)疑問(wèn)???,不是說(shuō)對(duì)對(duì)象的引用都在棧里嗎?那么實(shí)例對(duì)象的引用不應(yīng)該也在棧里嗎?
看了下面這位的解答,感覺(jué)能夠理解了。

引用類(lèi)型的變量也可以是局部變量,局部變量保存在棧區(qū),可它所引用的對(duì)象保存在堆中或者常量池中。
一個(gè)對(duì)象中的成員變量,也就是你說(shuō)的實(shí)例變量,跟對(duì)象在一起,對(duì)象在堆中,那么它也在堆中。

已經(jīng)說(shuō)的不需要再補(bǔ)充了。
關(guān)于堆棧的理解又比以前深了一點(diǎn)呢~~

總結(jié)

以上是生活随笔為你收集整理的从lambda表达式看final关键字的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。