重用Java的闭包/匿名类来获得性能?

And*_*hev 1 java performance closures anonymous-class java-8

当我使用匿名类进行小型操作(如过滤集合)时,会在Java 8中为新的匿名类实例或闭包进行内存分配.

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

我应该在Java 8中重用这样的谓词或闭包吗?始终/循环/无GC方法?

ass*_*ias 5

创建许多小对象几乎是免费的(分配和GC),但需要注意的是GC会更频繁地运行,因此与它相关的性能成本很低.创建匿名内部类也有特定问题 - 这个问题有几个答案可以解决这个问题.

但是创建一个lambda,如:

String firstNonEmpty = Lists.find(list, (s) -> !s.isEmpty());
Run Code Online (Sandbox Code Playgroud)

不一定会创建一个新对象.特别是对于像那样的无状态lambda,JVM应该只创建一个lambda"对象"并重用它.