重用Java的闭包/匿名类以提高性能?

重用Java的闭包/匿名类以提高性能?,java,performance,closures,anonymous-class,java-8,Java,Performance,Closures,Anonymous Class,Java 8,当我将匿名类用于过滤集合之类的小操作时,在Java8中会为新的匿名类实例或闭包分配内存 String firstNonEmpty = Lists.find(list, new Predicate<String>(){ public String apply(String s){ return !s.isEmpty();} }); 我应该在Java8中重用这样的谓词还是闭包?总是/在一个周期内/在一个无GC的方法中?创建许多小对象接近于免费分配和GC,但需要注意的是GC将更

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

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

我应该在Java8中重用这样的谓词还是闭包?总是/在一个周期内/在一个无GC的方法中?

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

但是,创建lambda,如中所示:

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

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

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

但是,创建lambda,如中所示:

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

不一定要创建新对象。特别是,对于这种无状态lambda,JVM应该只创建一个lambda对象并重用它。

这样的小对象的分配足够便宜,几乎不值得担心。可能的重复可能是肯定的,因为为琐碎的操作创建匿名类是无效的。在一个具有闭包效率的部分中似乎非常不同。像这样的小对象的分配足够便宜,几乎不值得担心。在一个为琐碎操作创建匿名类无效的部分中,可能存在重复的可能是肯定的。在闭包效率方面似乎有很大的不同。这会在磁盘上创建一个类文件吗?在检查字节码和生成的类时,我观察到它会向现有类添加一个方法,但不会创建一个新类-但是lambda调用站点使用invokedynamic,我不能100%确定在运行时会发生什么。有关更多详细信息和性能数据,请参见。最坏情况下的lambda数等于内部类,最好情况下的lambda数更好谢谢这会在磁盘上创建类文件吗?检查字节码和生成的类时,我注意到它向现有类添加了一个方法,但没有创建新类——但是lambda调用站点使用invokedynamic,我不能100%确定运行时会发生什么。有关更多详细信息和性能数据,请参见。最坏情况下的lambda数等于内部类,最佳情况下的lambda数更好,谢谢