有效地使用Java Lambda中的最终变量-Maurice Naftalin掌握Lambda

有效地使用Java Lambda中的最终变量-Maurice Naftalin掌握Lambda,lambda,java-8,Lambda,Java 8,在阅读莫里斯·纳夫塔林(Maurice Naftalin)的《掌握Lambdas》(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

在阅读莫里斯·纳夫塔林(Maurice Naftalin)的《掌握Lambdas》(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不需要改变状态,只能访问final或有效的final变量,那么上面的代码首先是如何有效的呢

如果我遗漏了什么,有人能帮我理解吗


提前感谢。

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

//don't do this - race conditions!
library.stream().forEach(b -> pageCounter+=b.getPageCount());
如果
pageCount
是一个可变字段,或者是一个实例字段,或者是一个
static
字段,那么这两个字段都是有效的语法,都可以编译,但是,当然,这本书是对的,不推荐使用这两个字段


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

Aah!实例变量或静态变量可能是。。。错过了这么简单的事情:-)谢谢。圆括号如
.forEach(b->(pageCounter+=b.getPageCount())在此上下文中无效,因为
(表达式)
不是有效的使用者。如果需要
使用者
,则需要像
.forEach(b->{pageCounter+=b.getPageCount();})
中那样的大括号,或者不需要像
中那样的括号。forEach(b->pageCounter+=b.getPageCount())
使用正确的语法编辑。
//formally correct but inefficient and ugly
library.stream().forEachOrdered(b -> pageCount+=b.getPageCount());