2016-11-08 68 views
2

我正尝试创建从一个POJO功能getValue(),在这个意义上使用细节阶级的价值观summatory:局部变量必须是最终

@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());招来这样的错误:

local variables referenced from a lambda expression must be final or effectively final

你能说我什么我'做错了。谢谢。

+1

错误信息使用lambda表达式是相当明确的,如果你想从lambda中访问它,局部变量('sum')必须是'final'。所以你不能像你展示的那样去做,而必须以另一种方式来实现。 –

+0

对,我发布了一个答案,但后来意识到它仍然无法正常工作,因为他试图修改总和。 – Enwired

+0

但是,如果我声明局部变量'sum'就像'final'一样,那么我会得到下一个错误:“无法为最终变量总和赋值” – axiorema

回答

6

不能从lambda里面修改变量。这不是你允许做的事情。

什么你可以在这里做的是写这方法

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

哦,非常有趣,我会试着去理解这个;)谢谢 – axiorema

+0

这是一个非常有益的答案,我学到了很多东西。我喜欢'map'和'reduce'功能。谢谢。 – axiorema

2

好了,只是不foreach循环

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

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

    return sum; 
} 
相关问题