Skip to content

Commit

Permalink
8181175: Stream.concat behaves like terminal operation
Browse files Browse the repository at this point in the history
Reviewed-by: smarks, briangoetz, dfuchs
  • Loading branch information
psandoz committed Nov 29, 2017
1 parent 44e7ad3 commit fcb3144
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 1 deletion.
16 changes: 16 additions & 0 deletions src/java.base/share/classes/java/util/stream/DoubleStream.java
Original file line number Diff line number Diff line change
Expand Up @@ -1089,11 +1089,27 @@ public static DoubleStream generate(DoubleSupplier s) {
* streams is parallel. When the resulting stream is closed, the close
* handlers for both input streams are invoked.
*
* <p>This method operates on the two input streams and binds each stream
* to its source. As a result subsequent modifications to an input stream
* source may not be reflected in the concatenated stream result.
*
* @implNote
* Use caution when constructing streams from repeated concatenation.
* Accessing an element of a deeply concatenated stream can result in deep
* call chains, or even {@code StackOverflowError}.
*
* @apiNote
* To preserve optimization opportunities this method binds each stream to
* its source and accepts only two streams as parameters. For example, the
* exact size of the concatenated stream source can be computed if the exact
* size of each input stream source is known.
* To concatenate more streams without binding, or without nested calls to
* this method, try creating a stream of streams and flat-mapping with the
* identity function, for example:
* <pre>{@code
* DoubleStream concat = Stream.of(s1, s2, s3, s4).flatMapToDouble(s -> s);
* }</pre>
*
* @param a the first stream
* @param b the second stream
* @return the concatenation of the two input streams
Expand Down
16 changes: 16 additions & 0 deletions src/java.base/share/classes/java/util/stream/IntStream.java
Original file line number Diff line number Diff line change
Expand Up @@ -1081,11 +1081,27 @@ public static IntStream rangeClosed(int startInclusive, int endInclusive) {
* streams is parallel. When the resulting stream is closed, the close
* handlers for both input streams are invoked.
*
* <p>This method operates on the two input streams and binds each stream
* to its source. As a result subsequent modifications to an input stream
* source may not be reflected in the concatenated stream result.
*
* @implNote
* Use caution when constructing streams from repeated concatenation.
* Accessing an element of a deeply concatenated stream can result in deep
* call chains, or even {@code StackOverflowError}.
*
* @apiNote
* To preserve optimization opportunities this method binds each stream to
* its source and accepts only two streams as parameters. For example, the
* exact size of the concatenated stream source can be computed if the exact
* size of each input stream source is known.
* To concatenate more streams without binding, or without nested calls to
* this method, try creating a stream of streams and flat-mapping with the
* identity function, for example:
* <pre>{@code
* IntStream concat = Stream.of(s1, s2, s3, s4).flatMapToInt(s -> s);
* }</pre>
*
* @param a the first stream
* @param b the second stream
* @return the concatenation of the two input streams
Expand Down
16 changes: 16 additions & 0 deletions src/java.base/share/classes/java/util/stream/LongStream.java
Original file line number Diff line number Diff line change
Expand Up @@ -1086,11 +1086,27 @@ public static LongStream rangeClosed(long startInclusive, final long endInclusiv
* streams is parallel. When the resulting stream is closed, the close
* handlers for both input streams are invoked.
*
* <p>This method operates on the two input streams and binds each stream
* to its source. As a result subsequent modifications to an input stream
* source may not be reflected in the concatenated stream result.
*
* @implNote
* Use caution when constructing streams from repeated concatenation.
* Accessing an element of a deeply concatenated stream can result in deep
* call chains, or even {@code StackOverflowError}.
*
* @apiNote
* To preserve optimization opportunities this method binds each stream to
* its source and accepts only two streams as parameters. For example, the
* exact size of the concatenated stream source can be computed if the exact
* size of each input stream source is known.
* To concatenate more streams without binding, or without nested calls to
* this method, try creating a stream of streams and flat-mapping with the
* identity function, for example:
* <pre>{@code
* LongStream concat = Stream.of(s1, s2, s3, s4).flatMapToLong(s -> s);
* }</pre>
*
* @param a the first stream
* @param b the second stream
* @return the concatenation of the two input streams
Expand Down
18 changes: 17 additions & 1 deletion src/java.base/share/classes/java/util/stream/Stream.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
Expand Down Expand Up @@ -1341,6 +1341,10 @@ public static<T> Stream<T> generate(Supplier<? extends T> s) {
* streams is parallel. When the resulting stream is closed, the close
* handlers for both input streams are invoked.
*
* <p>This method operates on the two input streams and binds each stream
* to its source. As a result subsequent modifications to an input stream
* source may not be reflected in the concatenated stream result.
*
* @implNote
* Use caution when constructing streams from repeated concatenation.
* Accessing an element of a deeply concatenated stream can result in deep
Expand All @@ -1349,6 +1353,18 @@ public static<T> Stream<T> generate(Supplier<? extends T> s) {
* <p>Subsequent changes to the sequential/parallel execution mode of the
* returned stream are not guaranteed to be propagated to the input streams.
*
* @apiNote
* To preserve optimization opportunities this method binds each stream to
* its source and accepts only two streams as parameters. For example, the
* exact size of the concatenated stream source can be computed if the exact
* size of each input stream source is known.
* To concatenate more streams without binding, or without nested calls to
* this method, try creating a stream of streams and flat-mapping with the
* identity function, for example:
* <pre>{@code
* Stream<T> concat = Stream.of(s1, s2, s3, s4).flatMap(s -> s);
* }</pre>
*
* @param <T> The type of stream elements
* @param a the first stream
* @param b the second stream
Expand Down

0 comments on commit fcb3144

Please sign in to comment.