Java 8 lambda表达式中为什么要求外部变量为final
Posted 努力lshdnks
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 8 lambda表达式中为什么要求外部变量为final相关的知识,希望对你有一定的参考价值。
为什么写这篇文章呢,因为时不时冒出来一个菜鸟,都不会看回答,只会抓住下半句,看不到上半句(或者说太菜了看不懂?)
=====================这是回答分割线==================
本质是java值传递和引用传递的区别。java数据类型大体包括两类:基本数据类型和引用类型。
明白这两者的区别后,你就会明白Java 8 lambda表达式中为什么要求外部变量为final。
函数入参是基本数据类型时,实际上是拷贝了该数据在函数内部创建了一份副本,该副本作用域只在此函数内部,不会影响外面的数据。
函数入参是引用类型时,实际上是将该引用对象的引用地址(类似于c语言的指针)传递给了函数内部,函数内部可以通过该引用地址找到该数据存放内存区域进行数据修改操作,会影响函数外部的数据,因为是同一个引用地址。
下面看看值传递:
下面再看看引用传递(这里不用Integer是因为存在自动拆箱,实际还是值传递):
Java 8 lambda表达式本质是匿名函数,因此也遵循上述的传递规律,但在设计上为了编程的友好性,因此不允许传递基本数据类型(值传递在函数内部改变了不会影响外面的值),另外引用类型传递,在外部定义必须是final或者effectively final(只允许被定义一次),是因为传递引用地址,如果多次定义那么引用地址改变了,在lambda表达式内部做操作就没有任何意义;附,在lambda表达式前面也不允许多次定义,是因为lambda表达式设计有异步
以上是关于Java 8 lambda表达式中为什么要求外部变量为final的主要内容,如果未能解决你的问题,请参考以下文章
Java 8 lambda表达式中为什么要求外部变量为final