【在stream的foreach中让int i递增】

在stream的foreach中让int i递增

因为lambada表达式中的局部变量必须是final或effectively final,也就是说,他们在声明后不能被重新赋值。如果想在lambda表达式中使用一个可变的局部变量,并在其中自增。

方法一 线程安全

if (CollectionUtil.isNotEmpty(detailList)) {
    AtomicInteger counter = new AtomicInteger(0);
    detailList.stream().forEach(m -> {
    
        if ("superPassword".equals(m.getType())) {
         // 获取当前的计数器值,并自增
        int i = counter.getAndIncrement();
            AccountPo accountPo = accountService.queryByKey(item.getAccountid());
            String[] split = accountPo.getSuperpwd().split(",");
            sb.append(split[i]).append("\n");
        }

        if (ObjectUtil.isNotEmpty(m.getValue())) {
            sb.append(m.getValue()).append("\n");
        }
    });
}

在这个示例中,我们使用 AtomicInteger 类型的 counter 变量作为计数器,并通过 getAndIncrement() 方法来获取当前值并自增。这样,就可以在 lambda 表达式中使用该计数器,并在其中自增,而不会导致编译错误。
请注意,由于 AtomicInteger 是线程安全的,因此不需要担心并发访问导致的错误

方法二 多线程情况下,线程不安全

if (CollectionUtil.isNotEmpty(detailList)) {
    int[] counter = {0}; // 定义一个数组来存储计数器的值
    detailList.stream().forEach(m -> {
     
        if ("superPassword".equals(m.getType())) {
         // 获取当前的计数器值,并自增
        int i = counter[0]++;
            AccountPo accountPo = accountService.queryByKey(item.getAccountid());
            String[] split = accountPo.getSuperpwd().split(",");
            sb.append(split[i]).append("\n");
        }

        if (ObjectUtil.isNotEmpty(m.getValue())) {
            sb.append(m.getValue()).append("\n");
        }
    });
}

使用数组‘counter’来存储计数器的值,然后再lambda表达式中通过 counter[0]++ 来获取并自增计数器的值。由于数组是引用类型,而不是基本数据类型,因此可以在 lambda 表达式中对数组元素进行修改,从而实现对局部变量的修改。然而,需要注意在多线程环境下可能会引发并发访问的问题,因此需要谨慎使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值