【问题标题】:Use setter methods while iterating over collections using lambdas在使用 lambda 迭代集合时使用 setter 方法
【发布时间】:2015-03-05 21:39:51
【问题描述】:

这似乎是一个简单的问题,但我一直被这个小问题所困扰。

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

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

【问题讨论】:

  • 您可以发布您遇到的错误吗? (编辑您的原始帖子)

标签: java collections lambda java-8


【解决方案1】:

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

【讨论】:

  • 好吧,我没想到!非常感谢你!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-05
  • 2018-10-25
  • 2012-07-05
  • 2014-12-27
  • 2010-12-26
  • 2016-04-14
  • 1970-01-01
相关资源
最近更新 更多