Java lambda-修改forEach循环中的值

Java lambda-修改forEach循环中的值,java,lambda,foreach,Java,Lambda,Foreach,我试着用lambdas实现类似的功能。然而,“我”必须是最终的 int i = 1; for (Object obj : list) { if (something) { i++; } } 编辑: 但是,如果我想添加,比方说,一个不同对象的值,该怎么办 int i = 1; for (Object obj : list) { if (something) { otherMethod(i); i += obj.getValue(); } } 您可以这

我试着用lambdas实现类似的功能。然而,“我”必须是最终的

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

但是,如果我想添加,比方说,一个不同对象的值,该怎么办

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

您可以这样做:

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

其中
something
是过滤
的标准,正如在为计算元素而编写的第一个答案中一样,首先过滤,然后减少(使用
count()

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

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

在使用流时,不应修改任何内容。(
forEach
可能是个例外)。

简短的回答是,如果你正在思考如何将功能风格与突变结合起来,这已经是一个致命的起点。谢谢你回答我的问题!但是如果我想添加,比如说,一个对象与另一个对象不同的值呢?那么你可以使用映射中间操作。你到底想实现什么?从每个对象提取某种类型的值?求和?是的,从列表中的每个对象中获取一个值并求和-确切地说,我想循环遍历列表,并在使用当前和调用另一个方法后,为每个条目添加sume。很抱歉,原来的问题不好-我编辑了它。处理流时应该避免副作用。能否显示
otherMethod
的定义以及从
getValue
返回的类型。
list.stream()
    .filter(obj -> something)
    .mapToInt(obj -> obj.getValue())
    .sum()