gpt4 book ai didi

java - 匿名类中的 Lambda 状态和缺陷

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:11:18 25 4
gpt4 key购买 nike

我正在再次阅读关于 State of Lambda 的 Brian Goetz 文档他详细介绍了 Java 需要 lambda 表达式的许多原因。

在其中一段他写道:

Given the increasing relevance of callbacks and other functional-style idioms, it is important that modeling code as data in Java be as lightweight as possible. In this respect, anonymous inner classes are imperfect for a number of reasons, primarily:

  1. Bulky syntax
  2. Confusion surrounding the meaning of names and this
  3. Inflexible class-loading and instance-creation semantics
  4. Inability to capture non-final local variables
  5. Inability to abstract over control flow

从这个不完美列表中,我相信我对第 (1)、(2) 和 (4) 项的理解相当好。

但我不知道(3)和(5)中的问题到底是什么。

有人可以提供任何示例,说明在使用匿名类时这两个问题如何成为问题吗?

并非我从事的所有项目都在 Java 8 上,所以我认为了解这些缺点很重要,最重要的是清楚地看到现在使用 Java 8 lambda 的情况如何变得更好。此外,由于 Brian 是 lambda 项目的领导者之一,我认为值得花时间思考一下他的意思,这可能会让我顿悟 :-)

最佳答案

5。无法抽象控制流很容易。

Lambda 非常适合迭代集合中的所有元素。

aCollection.forEach(myLambda)

您必须使用 for 循环或迭代器或类似的旧方法。

for( ....){
//same code as what's in the lambda
}

这称为内部 迭代。我们不仅要告诉集合如何处理集合中的每个元素,还要告诉集合如何获取每个元素。此代码按顺序遍历所有对象。有时出于性能原因,这并不是最佳选择。

Lambda 允许我们进行外部 迭代。我们只告诉集合如何处理每个元素。如何访问每个元素以及以什么顺序访问 Collection 实现,以使用内部实现知识以最有效的方式进行访问。它甚至可能是并行的而不是顺序的。

3。不灵活的类加载和实例创建语义

是关于如何加载和实例化匿名类的较低级别的问题。我将向您指出这篇文章:http://www.infoq.com/articles/Java-8-Lambdas-A-Peek-Under-the-Hood

但基本上

  1. 匿名类需要为每个类创建新的类文件(MyClass$1 等)。必须加载这个额外的类。 Lambda 不会生成新的类文件,它们的字节代码是在运行时动态创建的。
  2. future 的 Java 版本可能会在底层让 Lambda 变得不同。通过在运行时生成 lambda 字节码, future 的版本可以安全地改变 Lambda 的创建方式而不会破坏任何东西

关于java - 匿名类中的 Lambda 状态和缺陷,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27884072/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com