在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 表达式中对数组元素进行修改,从而实现对局部变量的修改。然而,需要注意在多线程环境下可能会引发并发访问的问题,因此需要谨慎使用。