2016-09-09 4 views
1

。このことは何それは私を与えた:リストのforeach方法

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

、これが良いようですが、その後、私のIDEは、あなたは次のようになりラムダ式にこれを変換することができます言っていた。

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

印象はGameObject:: updateはラムダ式のある時です。念頭に置いて、私は(object) -> object.update()のJava 8の唯一の新しいものを匿名クラスの代わりに使っています。

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

をそして、それがそうであるならば、私のオリジナルの方法は、GameObject::updateその方が効率的になります。

することは、この本質「objects.forEach(ゲームオブジェクト::更新)」は意味ありません。 GameObject::updateというメソッドを残しましたが、元のメソッドが効率的であれば元に戻します。

純粋にパフォーマンスに基づいて質問しています。

+2

'GameObject :: update'は[メソッド参照]です(https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html) – flakes

+0

パフォーマンスの違いは無視できます。 – marstran

+2

"私は純粋にパフォーマンスベースで質問しています。"その時点でパフォーマンスの問題が実際に発生していることが証明される前に、このようなレベルでマイクロオプティマイゼーションを実行してはなりません。 [早すぎる最適化は悪魔です](https://en.wikipedia.org/wiki/Program_optimization#When_to_optimize) –

答えて

2

これまでに一番気に入ったのは、最もシンプルで分かりやすく、これで十分に機能すると思います。アプリケーションをプロファイリングし、これがあなたの最大の問題の1つであることを示したら、最適化を検討する必要があります。メソッド参照とラムダ式の間

学術目的のためにしかし

...

一つの重要な違いは、これらが非キャプチャしているということです。つまり、オブジェクトはHotSpot Java 8で初めて作成されたことを意味します。匿名の内部クラスを使用する場合は、コードが呼び出されるたびに作成されます(各繰り返しでは作成されません)。注:for-eachループを使用すると、これは新しいオブジェクトを作成する可能性がありますそれを排除しないエスケープ解析です。

どちらの方法でも、その差はマイクロ秒よりはるかに短い可能性があります。

+2

*メソッドリファレンスまたはラムダ式が非キャプチャである場合、インスタンスは1つしか存在しません(実装に依存します)。これはメソッドリファレンスとラムダ式の違いではないと思いますが、それはあなたが言いたいことではないと思います... – Holger

+1

ここで問題となっているラムダ( 'object-> object.update()')もキャプチャしていません。 –

関連する問題