为什么在Java Stream接口中重载()的varargs方法?

jac*_*646 5 java overloading variadic-functions java-stream spliterator

接口有两个重载方法of().其中一个是变量方法,而另一个是一个参数.

单参数方法是一种性能优化,而不是将一个参数传递给变量方法?如果是这样,它如何提高性能?可以问这个empty()方法的相同问题,这似乎是围绕变量的语法糖of().

我看到这些方法的实现方式不同,显然差别在于如何Spliterator实例化; 但这为StreamAPI 提供了什么优势?

Tag*_*eev 6

空流和单个元素流是非常常见的用例,尤其是当您使用时.flatMap().例如,这里是如何Optional.stream()实现在Java的9:

public Stream<T> stream() {
    if (!isPresent()) {
        return Stream.empty();
    } else {
        return Stream.of(value);
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,鉴于Optionals流,您可以通过以下方式将它们打包到平面流中:

streamOfOptionals.flatMap(Optional::stream);
Run Code Online (Sandbox Code Playgroud)

在这里,您可以创建大量的空流以及单个元素流,因此优化此类情况看起来非常合理.特别是,Stream.empty()Stream.of()不创建空数组并且不创建spliterator(它重用相同的spliterator实例)不同.Stream.of(T)在内部也特别优化StreamBuilderImpl,因此没有为单个元素分配数组.


Lou*_*man 5

是的,这是一个优化,以避免创建一个数组只包含一个元素的开销,这是你使用varargs版本时得到的.

可以询问empty()方法的相同问题,这似乎是围绕变量arity()的语法糖

你在看什么实现版本?当我看到实现时,我没有看到这一点.

  • @ jaco0646你在编写一个与`java.util.stream.Stream`一样广泛使用的API吗?如果没有,那么它可能不值得担心. (4认同)