java8 stream.foreach()无法赋值外部变量

我接触到关于遍历的方式有如下几种:
1.普通的,入门的
for(int i=0; i }
2.增强for循环
for(Object o : list) {
}
3.使用Iterator:
Iterator iterator = list.iterator();
while(iterator.hasNext()){
}
java8中新增了lamada新特性的list.stream.foreach(object ->{}),我也在逐渐从增强for循环转用这种,不过,在使用途中会出现这个问题:
Variable used in lambda expression should be final or effectively final…
java8 stream.foreach()无法赋值外部变量_第1张图片
也就是我在循环体外部赋值的变量,无法在循环体内再次重新赋值。百度了一下,都说变量用final修饰,这个方法也是醉了,加了final声明这个变量是常量型,我怎么再去给这个变量重新赋值呢…

出现问题的原因是:这个lamada表达式是类似于java匿名内部类的方式实现的,在匿名的内部类中访问局部变量,只能访问常量

我自己刚遇到这个问题的时候有两个解决方案:
1.emmm,换成增强for循环算了…比较没有追求,hhhh
2.将上图循环体中得到的结果重新使用一个新的对象代替,然后使用list.addAll()…也就是这样的效果
List assetDetailRecordDtoList = assetMapper.getAssetDetailRecordByRecordId(assetCycleCountRecord1.getId());
assetDetailRecordDtos.addAll(assetDetailRecordDtoList);
不过这样感觉比较浪费内存
以我的理解来看,=这种赋值,将原来对象指向的内存地址换掉了,但是addAll这种方式,原来的对象所指向的地址还是原来的地址,所以第二种方式可行。(不对的话,请指出…)

接着查找了一下别的方法,有的说将变量放在方法之外,使用static修饰作为类变量,或者作为成员变量,试了一下,是可以的
在这里插入图片描述

还有就是将其用数组的形式赋值:(不过这种方式,存到数组中,再取出来,有些麻烦)
AssetDetailRecordDto[] dto = new AssetDetailRecordDto[1];
dto[0] = …;

关于这个问题就暂时研究到这里。

Tip:break报错,才疏学浅,应该用return中断遍历…T.T

你可能感兴趣的:(java,后端,spring,boot)