在使用 lambda 遍历集合时使用 setter 方法
Use setter methods while iterating over collections using lambdas
这似乎是一个简单的问题,但我一直被这个小问题所困扰。
在 java7 中,您可以遍历对象并为其属性设置新值。
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++);
});
这显然会出错...
正如我所说,这可能是我犯的初学者错误,但任何帮助都会很棒!
您的尝试无效,因为在 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));
这似乎是一个简单的问题,但我一直被这个小问题所困扰。
在 java7 中,您可以遍历对象并为其属性设置新值。
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++);
});
这显然会出错... 正如我所说,这可能是我犯的初学者错误,但任何帮助都会很棒!
您的尝试无效,因为在 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));