Lambda表达式中需要修改外部变量(Java)
在java开发中常会使用到Lambda表达式的使用,但如果想在Lambda表达式中更改外部的变量,程序并不不会报错,但修改只在Lambda表达式中才有效。
直接上结论,要想解决这个问题,要么把这个外部变量定义为是全局的数组,要么这个变量是某个具体实例化类的成员。
我首次遇到这个问题就是在已经封装好的项目中,去实现具体的逻辑,但前人都是用lambda表达式写的。我就只能去百度得到的结果是
“lambda 表达式接受外部变量是通过copy副本的方式,所以编译器要求不能修改该变量值或则引用值,如果要修改可以通过集合或则实体类包装的方式实现。”
根据知乎的高赞回答,我总算是理解了这个设计方法,(参考链接贴出来了哦,我只是转述的)
应该是设计上缩水了。这个地方应该实现一个闭包的语义,编译器需要把闭包的对象引用传给内部类。但java实现时没有传引用,而是直接copy了数据。也就是里外两个变量实际上是两个名字和值相同,但各自独立的东西。如果该数据在内部类的函数里可以修改,就会出现里外不一致,于是会露馅。因此java干脆规定这种变量必须是final的,不能改。
因为项目的特殊性,局限性,选择方法就及其有限,而且我的eclipse还不报错debug了半天才发现这个错误。于是果断改用全局数组变量。
解决方法已经说了,下面是我具体遇到的问题具体代码的具体代码
用一个全局变量记录房间号码
因为寻找房间的具体操作的在Lambda表达式中的,所以要记录下来只能用全局变量
然后再调用该全局变量来使用