【问题标题】:Incrementing counter in LinkedHashMap using foreach-loop [duplicate]使用 foreach 循环在 LinkedHashMap 中递增计数器 [重复]
【发布时间】:2022-01-03 13:45:44
【问题描述】:

我正在循环通过 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

【问题讨论】:

标签: java android foreach hashmap linkedhashmap


【解决方案1】:

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

使用 AtomicInteger:

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);

        });
}

```

【讨论】:

  • 我收到此错误必需类型:AtomicInteger 提供:int
  • 使用你需要的AtomicInteger方法,incrementAndGet()、getAndIncrement()、decrementAndGet()、getAndDecrement()等。
【解决方案2】:

几个选项:

你可以迭代一个范围

IntStream.range(0, 10).forEach(n -&gt;...

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

Variable used in lambda expression should be final or effectively final这篇文章很好地讨论了为什么需要这样做。

【讨论】:

  • 我的范围不限于 10 它的最大 n 值
  • 是的,那就做...range(0, n).forEach(i -&gt;... 我链接的代码不是专门用于复制/粘贴,只是向您展示语法
猜你喜欢
  • 2019-01-20
  • 2021-01-13
  • 1970-01-01
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 2019-04-28
  • 1970-01-01
相关资源
最近更新 更多