Подтвердить что ты не робот

В Java 8 отсутствует Stream.concat, работающий над varags потоков?

В настоящее время у нас есть следующий Stream.concat в Java 8:

public static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b);

Я удивлен, почему нет версии, использующей 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);

Если были доступны varargs этой сигнатуры:

public static <T> Stream<T> concat(Stream<? extends T>... streams);

Тогда я мог бы написать это намного яснее:

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

Без всех видов вложенных вызовов Stream.concat.

Или есть другие причины, почему он не предоставляется?
Я не могу думать о таких причинах, так как мы в конечном итоге все еще выполняем работу varargs.

4b9b3361

Ответ 1

Просто flatMap it:

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

В вашем примере:

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