【问题标题】:List foreach method [duplicate]列出foreach方法[重复]
【发布时间】:2017-01-17 16:42:05
【问题描述】:

我做了这个方法:

public void update(){
        for(GameObject object : objects)
            object.update();
}

然后我的 IDE 可以用于每个,而不是任何,我认为我所做的,任何我让它替换它。这就是它给我的东西:

public void update(){
        objects.forEach(GameObject::update);
}

乍一看,这似乎更好,然后我的 IDE 说您可以将其转换为 lambda 表达式,即:

public void update(IUpdater updater){
        objects.forEach((object) -> object.update());
}

这给人的印象是GameObject:: update 是一些 lambda 表达式,记住我所知道的 java 8 的唯一新东西 (object) -> object.update() 替换了匿名类,猜测它仍然在某个地方。

这个本质'objects.forEach(GameObject::update)'是否意味着:

public void update(){
    objects.forEach(new Consumer<GameObject>() {
        @Override
        public void accept(GameObject object) {
            object.update();
        }
    });
}

如果是这样,那么我的原始方法会比GameObject::update 更有效。已将其方法保留为GameObject::update,但如果找到原始方法更有效,将其改回。

我纯粹是根据表现提出这个问题。

【问题讨论】:

  • GameObject::updatemethod reference
  • 性能差异可以忽略不计。
  • “我问的是纯粹基于性能的问题。”在证明您实际上确实存在性能问题之前,您永远不应该在这样的级别上进行微优化。 Premature optimization is the devil.
  • 不要仅仅因为 IDE 说你可以做某事,它就会自动变得更好。通常,如果您有一个 lambda 表达式,他们会说,您可以将其转换为方法引用,而当您有方法引用时,他们会说,您可以将其转换为一个 lambda 表达式,在这两种情况下,他们都说您可以将其转换为匿名类,反之亦然……

标签: java collections foreach lambda java-8


【解决方案1】:

我会使用您认为最简单和最清晰的任何一个,并且这可能会表现得足够好。一旦您分析了您的应用程序并表明这是您最大的问题之一,那么您应该考虑对其进行优化。

但是出于学术目的...

方法引用和 lambda 表达式之间的一个关键区别是它们是非捕获的。这意味着该对象只在 HotSpot Java 8 上创建一次。如果您使用匿名内部类,它将在每次调用代码时创建(但不是在每次迭代时) 注意:使用 for-each 循环使用迭代器和这可能会创建一个新对象,但逃逸分析不会消除它。

无论哪种方式,差异都可能远小于一微秒。

【讨论】:

  • 方法引用或 lambda 表达式未被捕获时,将只有一个实例(取决于实现)。这不是“方法引用和 lambda 表达式之间的区别”,我想这不是你想说的……
  • 这里的 lambda (object -&gt; object.update()) 也没有被捕获。
猜你喜欢
  • 1970-01-01
  • 2015-06-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
  • 2019-06-04
  • 2017-12-20
  • 2021-10-18
  • 2023-04-01
相关资源
最近更新 更多