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方法?
创建许多小对象几乎是免费的(分配和GC),但需要注意的是GC会更频繁地运行,因此与它相关的性能成本很低.创建匿名内部类也有特定问题 - 这个问题有几个答案可以解决这个问题.
但是创建一个lambda,如:
String firstNonEmpty = Lists.find(list, (s) -> !s.isEmpty());
Run Code Online (Sandbox Code Playgroud)
不一定会创建一个新对象.特别是对于像那样的无状态lambda,JVM应该只创建一个lambda"对象"并重用它.