OpenJDK8: java.util.stream.Stream.onClose
Paul Sandoz
paul.sandoz at oracle.com
Fri Jan 22 17:44:40 UTC 2016
Hi Carsten,
If you read the documentation further on down it states:
* first exception, since an exception cannot suppress itself.) May
* return itself.
The same applies to parallel/sequential/unordered. For these cases it would be rather inefficient to create new stages in the pipeline, for essentially functional no-ops regarding actual element processing, and would likely increase the cost when performing the terminal operation.
Paul.
> On 22 Jan 2016, at 17:14, Carsten Varming <varming at gmail.com> wrote:
>
> Dear core-libs-devs,
>
> I was playing around with streams and onClose and ran into an example with
> odd behavior (well, I found it odd, see example below). I was wondering if
> you could point me to prior discussions on semantics of intermediate
> operations and the semantics of Stream.onClose.
>
> A bit of code so we have something concrete to discuss:
>
> import java.util.stream.Stream;
>
> public class Example {
> public static void main(String[] args) {
> final Stream<String> foo = Stream.of("1", "2", "3");
> final Stream<String> bar = foo.onClose(() ->
> System.out.println("Closing bar"));
>
> try (final Stream<String> s = foo) {
> s.forEach(System.out::println);
> }
> }
> }
>
> When I run the program above I get:
> 1
> 2
> 3
> Closing bar
>
> Hmm, the onClose call mutated foo. This is surprising to me as when I read
> [1] it says onClose is an intermediate operation and I quote: "Returns an
> equivalent stream with an additional close handler.". The documentation
> does not mention that the stream passed to onClose is mutated. Is this the
> intended behavior or is it a bug? I hope it is a bug, but I would like to
> understand the reasons for the current implementation.
>
> [1]
> https://docs.oracle.com/javase/8/docs/api/java/util/stream/BaseStream.html#onClose-java.lang.Runnable-
>
> Carsten
More information about the core-libs-dev
mailing list