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

Kev*_*sen 0 java collections lambda java-8

这似乎是一个简单的问题,但我一直在坚持我的这个小问题.

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

for (int i = 0; i < continentLijst.size(); i++) {
        continentLijst.get(i).setContinentId(i);
}
Run Code Online (Sandbox Code Playgroud)

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

 int i =0;

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

        e.setContinentId(i++);
  });
Run Code Online (Sandbox Code Playgroud)

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

Ale*_* C. 6

您的尝试不起作用,因为lambda表达式中使用的变量必须(有效)为final(并且您尝试更新ilambda表达式中的值).

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

AtomicInteger counter = new AtomicInteger(0);
continentLijst.forEach(c -> c.setContinentId(counter.getAndIncrement()));
Run Code Online (Sandbox Code Playgroud)

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

IntStream.range(0, continentLijst.size())
         .forEach(i -> continentLijst.get(i).setContinentId(i));
Run Code Online (Sandbox Code Playgroud)