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