使用 foreach 循环在 LinkedHashMap 中递增计数器

Incrementing counter in LinkedHashMap using foreach-loop

我正在遍历 LinkedHashMap 并递增 i 计数器,下面是我过去使用 for 循环执行此操作的方式。

int i = 0;

for (Map.Entry<String, String> entry : linkedHashMap.entrySet()) {
      Car car = new Car();

      car.setCarId(String.valueOf(i++));
      car.setCarName(entry.getKey());
      car.setOdometerReading(entry.getValue());

      appRoomRepository.insertCarDetails(car);
}

下面是我想如何使用 foreach 循环

int i = 0;

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
     linkedHashMap.forEach((key, value) -> {
           Car car = new Car();

           car.setCarId(String.valueOf(i++));
           car.setCarName(key);
           car.setOdometerReading(value);

           appRoomRepository.insertCarDetails(car);
        });
}

我卡在这一行了car.setCarId(String.valueOf(i++));

我不断收到此错误消息“在 lambda 表达式中使用的变量应该是最终的或实际上是最终的”。如何增加计数器 i?

几个选项:

您可以使用范围进行迭代

IntStream.range(0, 10).forEach(n ->...

或者您可以使用 AtomicInteger 并将其命名为 'final'

这个 post 很好地讨论了为什么需要这样做。

Lambda 表达式可以使用在外部作用域中定义的变量 它们可以捕获静态变量、实例变量和局部变量,但只有局部变量必须是 final 或有效的 final

使用原子整数:

AtomicInteger i = new AtomicInteger(0);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {

     linkedHashMap.forEach((key, value) -> {

           Car car = new Car();

           car.setCarId(String.valueOf(i.getAndIncrement()));
           car.setCarName(entry.getKey());
           car.setOdometerReading(entry.getValue());

           appRoomRepository.insertCarDetails(car);

        });
}

```