1

当我将匿名类用于过滤集合之类的小操作时,Java 8 中会为新的匿名类实例或闭包分配内存。

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

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

4

1 回答 1

5

创建许多小对象几乎是免费的(分配和 GC),但需要注意的是 GC 会更频繁地运行,因此会产生轻微的性能成本。创建匿名内部类也有特定的问题——这个问题有几个解决这个方面的答案。

但是创建一个 lambda,如下所示:

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

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

于 2013-09-26T09:49:20.997 回答