匿名内部类,lambda表达式list.forEach的时候引用变量必须是final修饰的问题。
开发中遇到过以下问题,使用list.forEach循环的时候,不能对外部变量进行操作,而且提示:
Variable used in lambda expression should be final or effectively final
意思是:lambda表达式中使用的变量应该是final或实际上是final
这是因为lambda表达式list.forEach也是属于匿名内部类,匿名内部类实际上也是一个对象,只不过是匿名的,只要是对象就会存放到堆里面,而JVM堆里面的对象是由GC垃圾回收负责回收的,回收的时间不确定,对象的生命周期比方法长,这个时候就要求对象未被回收前,对象里面引用的其他变量也不能消失,否则就会有问题。如果这个对象还在,里面引用的变量却消失了肯定不行,直接定义int i = 0;这个变量是随着方法的结束而消失,加上final修饰后,这个变量就会被jvm放入到常量池中,不会因为方法结束就消失,所以匿名内部类引用外部变量的时候要使用final修饰,来保证自己这个对象没有消失前,所引用的变量还在。
匿名内部类,lambda表达式list.forEach的时候引用变量必须是final修饰
最新推荐文章于 2024-06-12 19:19:30 发布