在lambda中使用外部變量的一些心得分享
隨著java8的普及,越來越多的人開始使用lambda表達式。
然后初學(xué)者們總會遇到一個奇怪的問題:
Variable used in lambda expression should be final or effectively final
這個錯的產(chǎn)生的原因是因為在lambda表達式中訪問外部變量時,都不允許有修改變量的傾向,即
1、變量必須是final類型的
2、如果沒有定義成final,那么變量在初始化以后,不允許再有任何賦值的情況出現(xiàn)。(其實就是隱式final限制)
這種情況的具體原因本文不討論,百度一大堆解釋,本次主要討論如果有非final變量,如何在lambda中使用。
方法一
這是我最初遇到該類問題時的解決辦法,就是不用lambda,改為普通寫法。
如將forecah循環(huán)改為Iterator模式,這種方法一勞永逸。
方法二
利用list特性,地址不變,value可變。
List<User> a=new ArrayList<>();
boolean flag=true;
Set<Boolean> flagList =new HashSet<>();
a.forEach(item->{
if(item.getAge()>18) {
//Local variable flag defined in an enclosing scope must be final or effectively final
//flag=false;
flagList.add(false);
}
if(item.getName().equals("zhangsan")) {
flagList.add(false);
}
});
if(flagList.contains(false)) {
return false;
}如上,可能例子不太好。
之前公司的代碼是,要對list中所有的對象進行規(guī)則校驗,20多種情況。
在寫完以后才發(fā)現(xiàn)需要返回是否全部通過,這時改成迭代器模式就太麻煩了,于是就采用了這種方式返回。
方法三
有時我們會遇到另一種情況,定義一個value=0,當(dāng)type=1的時候,value=100。
并且這種情況不需要在foreach中反復(fù)處理,可以采用封裝方法的方式實現(xiàn)。
public static void main(String[] args) {
List<User> a=new ArrayList<>();
int value=0;
if(true) {
value=100;
}
int lambdaValue=getValue(true);
a.forEach(item->{
//Local variable flag defined in an enclosing scope must be final or effectively final
// item.setAge(value);
item.setAge(lambdaValue);
});
}
static int getValue(boolean flag) {
return flag?100:0;
}方法四
這個方法是方法三的變種,就是在之前處理完value后,將value再賦值給lambdaValue。
List<User> a=new ArrayList<>();
int value=0;
if(true) {
value=100;
}
int lambdaValue=value;
a.forEach(item->{
//Local variable flag defined in an enclosing scope must be final or effectively final
// item.setAge(value);
item.setAge(lambdaValue);
});方法三和方法四可以根據(jù)實際情況來選擇。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
java教程散列表和樹所對應(yīng)容器類及HashMap解決沖突學(xué)習(xí)
本篇篇文章是java教程,主要介紹了java教程散列表,樹所對應(yīng)容器類及HashMap解決沖突的學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10
Java基于二分搜索樹、鏈表的實現(xiàn)的集合Set復(fù)雜度分析實例詳解
這篇文章主要介紹了Java基于二分搜索樹、鏈表的實現(xiàn)的集合Set復(fù)雜度分析,結(jié)合實例形式詳細分析了Java基于二分搜索樹、鏈表的實現(xiàn)的集合Set復(fù)雜度分析相關(guān)操作技巧與注意事項,需要的朋友可以參考下2020-03-03
聊聊Java 成員變量賦值和構(gòu)造方法誰先執(zhí)行的問題
這篇文章主要介紹了聊聊Java 成員變量賦值和構(gòu)造方法誰先執(zhí)行的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10
解決fastjson從1.1.41升級到1.2.28后報錯問題詳解
這篇文章主要介紹了解決fastjson從1.1.41升級到1.2.28后報錯問題詳解,需要的朋友可以參考下2020-02-02
SpringBoot?如何使用sharding?jdbc進行分庫分表
這篇文章主要介紹了SpringBoot?如何使用sharding?jdbc進行分庫分表,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02

