Java 8 lambda表达式中为什么要求外部变量为final

本文探讨了Java中值传递和引用传递的区别,重点解释了为何Java8的Lambda表达式要求外部变量为final。在值传递中,函数内部修改的是副本,不影响外部;而在引用传递中,通过引用地址可以改变外部数据。Lambda表达式遵循同样的规则,为保持编程的一致性,外部变量如果是引用类型需为final,确保引用地址不变。
摘要由CSDN通过智能技术生成

为什么写这篇文章呢,因为时不时冒出来一个菜鸟,都不会看回答,只会抓住下半句,看不到上半句(或者说太菜了看不懂?)

=====================这是回答分割线==================

本质是java值传递引用传递的区别。java数据类型大体包括两类:基本数据类型引用类型

明白这两者的区别后,你就会明白Java 8 lambda表达式中为什么要求外部变量为final。

函数入参是基本数据类型时,实际上是拷贝了该数据在函数内部创建了一份副本,该副本作用域只在此函数内部,不会影响外面的数据。

函数入参是引用类型时,实际上是将该引用对象的引用地址(类似于c语言的指针)传递给了函数内部,函数内部可以通过该引用地址找到该数据存放内存区域进行数据修改操作,会影响函数外部的数据,因为是同一个引用地址。

下面看看值传递:

下面再看看引用传递(这里不用Integer是因为存在自动拆箱,实际还是值传递):

Java 8 lambda表达式本质是匿名函数,因此也遵循上述的传递规律,但在设计上为了编程的友好性,因此不允许传递基本数据类型(值传递在函数内部改变了不会影响外面的值,这里注意值传递变量作用域),另外引用类型传递,在外部定义必须是final或者effectively final(只允许被定义一次),是因为传递引用地址,如果多次定义那么引用地址改变了,在lambda表达式内部做操作就没有任何意义;附,在lambda表达式前面也不允许多次定义,是因为lambda表达式设计有异步

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值