从lambda表达式引用的局部变量必须是final

时间:2016-11-08 18:12:10

标签: java

我试图从pojo创建一个getValue()函数,在这个意义上使用细节类值的求和:

@Transient
public BigDecimal getValue() {
   BigDecimal sum = new BigDecimal(0);

   details.stream().forEach((detail) -> {
      sum = sum.add(detail.getValue());
   });

   return sum;
}

但我不知道为什么行sum = sum.add(detail.getValue());引发了这个错误:

  

从lambda表达式引用的局部变量必须是final或   有效的最终

你能告诉我我做错了什么吗?感谢。

3 个答案:

答案 0 :(得分:8)

无法修改lambda中的变量。这不是你被允许做的事情。

在这里做的是将此方法写为

return details.stream()
    .map(Detail::getValue)
    .reduce(BigDecimal.ZERO, BigDecimal::add);

答案 1 :(得分:2)

好的,只是不要在foreach循环中使用lambda表达式

@Transient
public BigDecimal getValue() {
   BigDecimal sum = new BigDecimal(0);

   for (Detail detail : details) {
      sum = sum.add(detail.getValue());
   }

   return sum;
}

答案 2 :(得分:0)

这是我在循环中避免最终p的方法,并且它有效。

public void getSolutionInfo(){      
ArrayList<Node> graph = Main.graph; 

    for(int p=1;p<=Pmax;p++) {          
        final int p2=p;
        System.out.printf("number of node with priority p = %d is %d ",p, graph.stream().filter(node->node.getPriority()==p2).count()); 
    }