Java 8是否缺少Stream.concat处理流的varags?

ski*_*iwi 48 java java-8 java-stream

目前我们Stream.concat在Java 8中有以下内容:

public static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b);
Run Code Online (Sandbox Code Playgroud)

我很惊讶为什么没有版本采取varargs Stream<? extends T>

目前我的代码编写如下:

Stream<Integer> resultStream = Stream.concat(stream1, Stream.concat(stream2, Stream.of(element)))
        .filter(x -> x != 0)
        .filter(x -> x != 1)
        .filter(x -> x != 2);
Run Code Online (Sandbox Code Playgroud)

如果提供此签名的varargs:

public static <T> Stream<T> concat(Stream<? extends T>... streams);
Run Code Online (Sandbox Code Playgroud)

然后我可以更清楚地写出:

Stream<Integer> resultStream = Stream.concat(
                stream1,
                stream2,
                Stream.of(element)
        )
        .filter(x -> x != 0)
        .filter(x -> x != 1)
        .filter(x -> x != 2);
Run Code Online (Sandbox Code Playgroud)

没有各种嵌套Stream.concat调用.

还是有其他原因没有提供?
我无法想到这样的原因,因为我们现在最终还是在做varargs电话.

Bor*_*der 49

就是flatMap这样:

public static void main(final String[] args) throws Exception {
    final Stream<String> stream1 = /*some stream*/
    final Stream<String> stream2 = /*some stream*/
    final Stream<String> stream3 = /*some stream*/
    final Stream<String> stream4 = /*some stream*/
    final Stream<String> stream5 = /*some stream*/

    final Stream<String> stream = Stream.of(stream1, stream2, stream3, stream4, stream5).flatMap(Function.identity());
}
Run Code Online (Sandbox Code Playgroud)

在你的例子中:

Stream<Integer> resultStream = Stream.of(stream1, stream2, Stream.of(element))
        .flatMap(identity())
        .filter(x -> x != 0)
        .filter(x -> x != 1)
        .filter(x -> x != 2);
Run Code Online (Sandbox Code Playgroud)


ass*_*ias 33

@RohitJain链接的线程中的消息中收集:

Stream.of(s1, s2, s3, ...)
  /* .parallel() if you want*/
  .reduce(Stream::concat)
  .orElseGet(Stream::empty);
Run Code Online (Sandbox Code Playgroud)

  • +1.该帖子表明,如果其中一个流是无限的,那么`flatMap`解决方案将不起作用. (2认同)
  • 我可以发现自己处于'flatMap`版本的冗长,但是这个版本似乎更冗长(你需要知道发生了什么),它会工作并且比手动连接10个流更好,当然,但我不看看为什么默认情况下功能不存在. (2认同)

Igo*_*bak 6

在Google Guava v21.0 +中,有:

com.google.common.collect.Streams#concat 方法