使用lambdas迭代集合时使用setter方法

时间:2015-03-05 21:39:52

标签: java collections lambda java-8

这似乎是一个简单的问题,但我一直陷入这个小问题。

在java 7中,您可以迭代对象并为其属性设置新值。

for (int i = 0; i < continentLijst.size(); i++) {
        continentLijst.get(i).setContinentId(i);
}

现在我正在寻找在Java 8 lambda中做同样的事情。 我想的是:

 int i =0;

 continentLijst.stream().forEach(e -> {

        e.setContinentId(i++);
  });

这显然会出错... 正如我所说,这可能是我初学者犯的错误,但任何帮助都会很棒!

1 个答案:

答案 0 :(得分:6)

您的尝试不起作用,因为lambda表达式中使用的变量必须是(effectively) final(并且您正尝试更新lambda表达式中i的值)。

您可以保留对计数器的引用(例如AtomicInteger

AtomicInteger counter = new AtomicInteger(0);
continentLijst.forEach(c -> c.setContinentId(counter.getAndIncrement()));

或使用IntStream生成相应索引的流:

IntStream.range(0, continentLijst.size())
         .forEach(i -> continentLijst.get(i).setContinentId(i));