我是靠谱客的博主 朴素奇迹,最近开发中收集的这篇文章主要介绍Java 之在Lambda代码中不能修改外部变量值,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

问题重现:

public void test() {
List<Integer> list = new ArrayList<>();
int sum = 0;
list.forEach(a -> {
sum += a;
});
}
public void test() {
List<Integer> list = new ArrayList<>();
list.forEach(a -> {
list = new ArrayList<>();
});
}

上面两段代码都会报错:Variable used in lambda expression should be final or effectively final。
意思是不允许在Lambda表达式中修改使用的(外部)变量。不管是修改对象的引用还是修改基本类型的值都是不可以的。

问题分析:


@Test
public void test1(){
List<String> list = new ArrayList();
Optional.of("aaa").ifPresent(str->{
list.add("ddd");
});
}

这段代码是不会报错的。

Lambda其实是一个匿名函数,在匿名函数里的变量引用,也叫做变量引用泄露,会导致线程安全问题,因此在Java8之前,如果在匿名类内部引用函数局部变量,必须将其声明为final,即不可变对象。

Java8这里加了一个语法糖:在lambda表达式以及匿名类内部,如果引用某局部变量,则直接将其视为final。所以不能修改引用值。

Lambda修改外部基本类型变量值:
使用线程安全Integer的AtomicInteger。
java.util.concurrent.atomic包下全部是线程安全的包装类。

@Test
public void test1(){
AtomicInteger i = new AtomicInteger(2);
Optional.of("aaa").ifPresent(str->{
i.set(6);
});
System.out.println(i);
}

最后

以上就是朴素奇迹为你收集整理的Java 之在Lambda代码中不能修改外部变量值的全部内容,希望文章能够帮你解决Java 之在Lambda代码中不能修改外部变量值所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(97)

评论列表共有 0 条评论

立即
投稿
返回
顶部