java - 使用 lambda 迭代集合时使用 setter 方法

标签 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++);
  });

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

最佳答案

您的尝试不起作用,因为 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));

关于java - 使用 lambda 迭代集合时使用 setter 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28888281/

相关文章:

java - 日历给出了第 1 年的意外结果

java - 如何在 Eclipse 中创建 Wildfly 14 服务器?

Java 8 toMap 用于映射 <string, Collection<String>>

c# - 使用 Lambda/Linq to objects 对列表进行排序

java - java中方法 "passing reference after assigning an object"和 "passing object using new keyword"之间的区别?

java - "Complete action using"尝试在 WebView 中加载时

c# - 通过特定属性从列表中删除另一个列表中的项目?

c# - 如何在没有调用的情况下合并两个 C# Lambda 表达式?

java - 需要一个保留顺序并具有 "order sensitive"equals/hashCode 的 map

java - 如何将 Set<String> 转换为 Set<Object>