【问题标题】:Java lambda - modify value in forEach loopJava lambda - 在 forEach 循环中修改值
【发布时间】:2018-02-24 17:28:54
【问题描述】:

我试图使用 lambdas 来实现这样的目标。但是,“i”必须是最终的。

int i = 1;
for (Object obj : list) {
 if (something) {
  i++;
 }
}

编辑:

但是如果我想添加一个不同对象的值怎么办?

int i = 1;
for (Object obj : list) {
   if (something) {
      otherMethod(i);
      i += obj.getValue();
   }
}

【问题讨论】:

  • 简短的回答是,如果您正在考虑如何将功能样式与突变结合起来,那已经是一个致命的起点。

标签: java lambda foreach


【解决方案1】:

你可以这样做:

int i = 1 + (int)list.stream().filter(something).count();

其中somethingfilter 的条件。

【讨论】:

  • 感谢您回答我的问题!但是,如果我想添加一个不同对象的值怎么办?
  • 然后就可以使用map中间操作了。
  • 你到底想达到什么目的?从每个对象中提取某种类型的值?总结一下还是?
  • 是的,从列表中的每个对象中获取一个值并对其求和 - 确切地说,我想遍历列表,并在使用当前总和。很抱歉原来的问题不好 - 我编辑了它。
  • 在使用流时应该避免副作用。你能显示otherMethod的定义和getValue返回的类型吗?
【解决方案2】:

正如第一个为计算元素而编写的答案一样,您首先过滤,然后减少(使用count())。

list.stream().filter(obj -> something).count();

但是,如果不想计算项目,而是根据对象使用一些值,则应首先将流映射到中间值,并使用例如减少它们。 sum.

list.stream()
    .filter(obj -> something)
    .mapToInt(obj -> obj.getValue())
    .sum()

在使用流时,您不应该修改任何东西。 (forEach 可能是一个例外)。

【讨论】:

    猜你喜欢
    • 2021-12-07
    • 2021-08-03
    • 1970-01-01
    • 2011-09-11
    相关资源
    最近更新 更多