从lambda表达式看final关键字
Variable used in lambda expression should be final or effectively final
想必大家在開發(fā)java程序的時(shí)候應(yīng)該經(jīng)常見到。
這是因?yàn)樵趌ambda的匿名表達(dá)式里需要傳入final的對(duì)象,那么這是為什么呢?
因?yàn)閘ambda是匿名表達(dá)式,它是在新開的一個(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ū)別:
首先可以看到局部變量一定要用final修飾。
其次來看一下局部變量和實(shí)例變量到區(qū)別:
可以看到實(shí)例變量不用final修飾也是可以在lambda中被使用的。
個(gè)人理解:
這是因?yàn)榫植孔兞科湟玫刂反娣旁跅V?#xff0c;而棧是線程私有的,是不允許在lambda新開的線程里去使用方法線程里的局部變量的。
而實(shí)例變量存放在堆中,是線程公有的,允許被不同個(gè)線程使用。
同時(shí)可知!
不是說lambda表達(dá)式里的變量一定要被final修飾,而是表達(dá)式里的局部變量一定要被final修飾。
到了這里我有一個(gè)疑問???,不是說對(duì)對(duì)象的引用都在棧里嗎?那么實(shí)例對(duì)象的引用不應(yīng)該也在棧里嗎?
看了下面這位的解答,感覺能夠理解了。
引用類型的變量也可以是局部變量,局部變量保存在棧區(qū),可它所引用的對(duì)象保存在堆中或者常量池中。
一個(gè)對(duì)象中的成員變量,也就是你說的實(shí)例變量,跟對(duì)象在一起,對(duì)象在堆中,那么它也在堆中。
已經(jīng)說的不需要再補(bǔ)充了。
關(guān)于堆棧的理解又比以前深了一點(diǎn)呢~~
總結(jié)
以上是生活随笔為你收集整理的从lambda表达式看final关键字的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: freebsd原理与设计精要(1)-fr
- 下一篇: MySQL操作之JSON数据类型操作详解