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

时间:2013-09-26 07:06:11

标签: 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();}
});

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

1 个答案:

答案 0 :(得分:5)

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

然而创建一个lambda,如:

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

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