Java Lambda中有效的最终变量 - 由Maurice Naftalin掌握Lambda

时间:2017-06-02 15:35:02

标签: lambda java-8

在阅读Maurice Naftalin的Mastering Lambdas时,我遇到了以下例子。 第3章,第3.2.4节是两个例子。

//don't do this - race conditions!
library.stream().forEach(b -> pageCounter += b.getPageCount());

另一个

//formally correct but inefficient and ugly
library.stream().forEachOrdered(b -> { pageCount+=b.getPageCount();});

我的困惑是没有编写上述代码的原因。由于lambda不是为了对状态进行处理而且只能访问最终或有效的最终变量,所以上述代码首先如何有效?

如果我遗失了某些东西,有人可以帮助我理解。

提前致谢。

1 个答案:

答案 0 :(得分:4)

由于括号错误,您的第一个示例的语法无效。但无论如何你可以省略它们:

//don't do this - race conditions!
library.stream().forEach(b -> pageCounter+=b.getPageCount());
//formally correct but inefficient and ugly
library.stream().forEachOrdered(b -> pageCount+=b.getPageCount());

两者都是有效的语法,如果pageCount是一个可变的字段,则可以编译实例字段或static字段,但当然,本书是是的,不推荐。

捕获变量的限制为final有效最终,仅适用于局部变量(包括参数)。