src/share/classes/java/util/stream/Stream.java

Print this page
rev 7573 : 8015315: Stream.concat methods
Contributed-by: brian.goetz@oracle.com, henry.jen@oracle.com

*** 881,886 **** --- 881,911 ---- public static<T> Stream<T> generate(Supplier<T> s) { Objects.requireNonNull(s); return StreamSupport.stream( new StreamSpliterators.InfiniteSupplyingSpliterator.OfRef<>(Long.MAX_VALUE, s)); } + + /** + * Creates a lazy concatenated {@code Stream} whose elements are all the + * elements of a first {@code Stream} succeeded by all the elements of the + * second {@code Stream}. The resulting stream is ordered if both + * of the input streams are ordered, and parallel if either of the input + * streams is parallel. + * + * @param <T> The type of stream elements + * @param a the first stream + * @param b the second stream to concatenate on to end of the first + * stream + * @return the concatenation of the two input streams + */ + public static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b) { + Objects.requireNonNull(a); + Objects.requireNonNull(b); + + @SuppressWarnings("unchecked") + Spliterator<T> split = new Streams.ConcatSpliterator.OfRef<>( + (Spliterator<T>) a.spliterator(), (Spliterator<T>) b.spliterator()); + return (a.isParallel() || b.isParallel()) + ? StreamSupport.parallelStream(split) + : StreamSupport.stream(split); + } }