Java 单例流.empty有意义吗?
对我当前的应用程序进行一些分析时,最主要的分配是对Java 单例流.empty有意义吗?,java,performance,java-stream,Java,Performance,Java Stream,对我当前的应用程序进行一些分析时,最主要的分配是对Stream.empty()的过度调用,这反过来又分配了一个新的ReferencePipeline.Head,导致大量虚假对象 这让我想到,为什么Stream.empty()不只是返回一个特殊的可重用单例流,而不是每次都分配新的单例流? 这是一个好主意吗?如果是的话,是否有任何库/示例已经这样做了?与空集合不同,流是可变的,甚至是空流 例如,Stream具有更改其状态的close()方法。法律要求 关闭后在流上操作将抛出 非法国家例外 它还说 应
Stream.empty()
的过度调用,这反过来又分配了一个新的ReferencePipeline.Head
,导致大量虚假对象
这让我想到,为什么Stream.empty()
不只是返回一个特殊的可重用单例流,而不是每次都分配新的单例流?
这是一个好主意吗?如果是的话,是否有任何库/示例已经这样做了?与空集合不同,流是可变的,甚至是空流 例如,
Stream
具有更改其状态的close()
方法。法律要求
关闭后在流上操作将抛出
非法国家例外
它还说
应该对流进行操作(调用中间或终端)
流操作)仅一次。例如,这排除了“分叉”的可能性
流,其中相同的源为两个或多个管道或
同一流的多次遍历。可以使用流实现
如果检测到流正在运行,则抛出IllegalStateException
重复使用
这意味着缓存流的实例没有意义,因为流无论如何都不能重用。Java 8版本的
stream.empty()
如下所示
public static<T> Stream<T> empty() {
return StreamSupport.stream(Spliterators.<T>emptySpliterator(), false);
}
因此,虽然他们没有重用空流,但他们正在重用空的
拆分器
,在对象分配中节省了一点。如果这是一个非常好的主意,它可能会被实现。JDK中有Collections.emptyXXX()
等,因此它肯定在JDK开发人员的工具箱中。可能是由于缺乏不变性或其他原因,导致该方法无法用于流。然而,我怀疑这是否是一个实际问题。如果Stream.empty()
是一个内存热点,您的应用程序会做什么?Collections.empty正是让我想到的。请注意flatMap
允许返回null
来表示空流。这可以防止过度创建空流实例。在flatMap
之外,这很少是一个问题。因为检测重用不是强制性的,实现可以使用缓存的空流(不引发重用)作为实现细节。但是,onClose
+close
的存在阻止了这一点。
public static <T> Spliterator<T> emptySpliterator() {
return (Spliterator<T>) EMPTY_SPLITERATOR;
}
private static final Spliterator<Object> EMPTY_SPLITERATOR =
new EmptySpliterator.OfRef<>();