当我使用匿名类进行小型操作(如过滤集合)时,会在Java 8中为新的匿名类实例或闭包进行内存分配。
String firstNonEmpty = Lists.find(list, new Predicate<String>(){
public String apply(String s){ return !s.isEmpty();}
});
我应该在Java 8中重用这样的谓词或闭包吗?总是/在一个循环中/在无GC的方法中?
答案 0 :(得分:5)
创建许多小对象接近于免费(分配和GC),但需要注意GC将更频繁地运行,因此与之相关的性能成本很低。创建匿名内部类也有特定问题 - this question有几个答案可以解决这个问题。
然而创建一个lambda,如:
String firstNonEmpty = Lists.find(list, (s) -> !s.isEmpty());
不一定会创建新对象。特别是对于像那样的无状态lambda,JVM应该只创建一个lambda“对象”并重用它。