在lambda中使用外部變量的一些心得分享
隨著java8的普及,越來越多的人開始使用lambda表達(dá)式。
然后初學(xué)者們總會遇到一個(gè)奇怪的問題:
Variable used in lambda expression should be final or effectively final
這個(gè)錯的產(chǎn)生的原因是因?yàn)樵趌ambda表達(dá)式中訪問外部變量時(shí),都不允許有修改變量的傾向,即
1、變量必須是final類型的
2、如果沒有定義成final,那么變量在初始化以后,不允許再有任何賦值的情況出現(xiàn)。(其實(shí)就是隱式final限制)
這種情況的具體原因本文不討論,百度一大堆解釋,本次主要討論如果有非final變量,如何在lambda中使用。
方法一
這是我最初遇到該類問題時(shí)的解決辦法,就是不用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中所有的對象進(jìn)行規(guī)則校驗(yàn),20多種情況。
在寫完以后才發(fā)現(xiàn)需要返回是否全部通過,這時(shí)改成迭代器模式就太麻煩了,于是就采用了這種方式返回。
方法三
有時(shí)我們會遇到另一種情況,定義一個(gè)value=0,當(dāng)type=1的時(shí)候,value=100。
并且這種情況不需要在foreach中反復(fù)處理,可以采用封裝方法的方式實(shí)現(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;
}方法四
這個(gè)方法是方法三的變種,就是在之前處理完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ù)實(shí)際情況來選擇。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot2.0整合logback日志的詳細(xì)代碼
這篇文章主要介紹了springboot2.0整合logback日志的應(yīng)用場景分析,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02
IDEA與模擬器安裝調(diào)試失敗的處理方法:INSTALL_PARSE_FAILED_NO_CERTIFICATES
這篇文章主要介紹了IDEA與模擬器安裝調(diào)試失敗的處理方法:INSTALL_PARSE_FAILED_NO_CERTIFICATES,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
Java Spring-IOC容器與Bean管理之基于注解的方式案例詳解
這篇文章主要介紹了Java Spring-IOC容器與Bean管理之基于注解的方式案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
使用MybatisPlus實(shí)現(xiàn)sql日志打印優(yōu)化
本文主要介紹了使用MybatisPlus實(shí)現(xiàn)sql日志打印優(yōu)化,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-08-08
Java 實(shí)用注解篇之@Qualifier 深度解析及實(shí)戰(zhàn)案例
在Spring框架中,@Qualifier是一個(gè)常見的注解,主要用于解決依賴注入(DI)時(shí)的歧義性,本文給大家介紹Java 實(shí)用注解篇之@Qualifier 深度解析及實(shí)戰(zhàn)案例,感興趣的朋友一起看看吧2025-06-06

