【问题标题】:Effectivitly Final Variable in Java Lambda - Mastering Lambdas by Maurice NaftalinJava Lambda 中的有效最终变量 - Maurice Naftalin 掌握 Lambda
【发布时间】:2017-06-03 11:24:41
【问题描述】:

在阅读 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();});

我的困惑是没有编写上述代码的原因。由于 lambdas 不应该改变状态并且只能访问最终或有效的最终变量,所以上面的代码首先如何有效?

如果我遗漏了什么,谁能帮助我理解。

提前致谢。

【问题讨论】:

  • .forEach(b -> (pageCounter += b.getPageCount())); 中的圆括号在此上下文中无效,因为 (expression) 不是有效的消费者。当需要 Consumer 时,您需要像 .forEach(b -> {pageCounter += b.getPageCount();}) 这样的花括号或像 .forEach(b -> pageCounter += b.getPageCount()) 这样的没有括号。
  • 用正确的语法编辑。

标签: lambda java-8


【解决方案1】:

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

//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实际上是最终的,仅适用于局部变量(包括参数)。

【讨论】:

  • 啊!实例变量或静态可能是可能的......错过了这么简单的事情:-) 谢谢。
猜你喜欢
  • 2015-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多