1

コレクションのフィルタリングなどの小規模な操作に匿名クラスを使用すると、新しい匿名クラス インスタンスまたは Java 8 のクロージャにメモリが割り当てられます。

String firstNonEmpty = Lists.find(list, new Predicate<String>(){
     public String apply(String s){ return !s.isEmpty();}
});

Java 8 でそのような述語またはクロージャーを再利用する必要がありますか? 常に/サイクルで/GC を使用しないメソッドで?

4

1 に答える 1

5

多くの小さなオブジェクトを作成することは無料に近く (割り当てと GC)、GC がより頻繁に実行されるという注意事項があるため、それに関連してわずかなパフォーマンス コストが発生します。匿名の内部クラスの作成にも特定の問題があります。この質問には、その側面に対処するいくつかの回答があります。

ただし、次のようにラムダを作成します。

String firstNonEmpty = Lists.find(list, (s) -> !s.isEmpty());

必ずしも新しいオブジェクトを作成するとは限りません。特に、そのようなステートレス ラムダの場合、JVM はラムダ「オブジェクト」を 1 つだけ作成して再利用する必要があります。

于 2013-09-26T09:49:20.997 に答える