В 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.
Ответы
Ответ 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);
Ответ 2
Получено сообщение в теме, связанной с @RohitJain:
Stream.of(s1, s2, s3, ...)
/* .parallel() if you want*/
.reduce(Stream::concat)
.orElseGet(Stream::empty);