Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 单例流.empty有意义吗?_Java_Performance_Java Stream - Fatal编程技术网

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<>();