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

我接触到关于遍历的方式有如下几种:
1.普通的,入门的
for(int i=0; i<list.size(); 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…
在这里插入图片描述
也就是我在循环体外部赋值的变量,无法在循环体内再次重新赋值。百度了一下,都说变量用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

  • 9
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值