列出foreach方法

时间:2016-09-09 13:50:04

标签: java collections foreach lambda java-8

我制作了这个方法:

2016-09-11T16:20:15.183895+00:00 heroku[router]: at=info method=GET path="/sockjs/info?cb=jwgw2yuvgl" host=remote-thewhozoo.herokuapp.com request_id=a49fafb2-9708-46d2-8117-2c789bfa6a3e fwd="105.186.215.147" dyno=web.1 connect=1ms service=2ms status=404 bytes=132

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

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

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

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

这给人的印象是public void update(IUpdater updater){ objects.forEach((object) -> object.update()); } 是lambda表达式的一段时间,记得我知道{8}的{8}的唯一新东西取代了匿名类,猜测它仍然在某个地方。

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

GameObject:: update

如果是这种情况,那么我的原始方法会比(object) -> object.update()更有效。将方法保留为public void update(){ objects.forEach(new Consumer<GameObject>() { @Override public void accept(GameObject object) { object.update(); } }); } ,但如果找到原始方法更有效,则会将其更改回来。

我纯粹基于表现来问这个问题。

1 个答案:

答案 0 :(得分:2)

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

但是出于学术目的......

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

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