Some small issues with the stream library
Paul Sandoz
paul.sandoz at oracle.com
Wed Jul 2 09:21:33 UTC 2014
Hi Kasper,
Sorry for the *very* late reply, i forgot about this, but was reminded when trawling through some bugs.
On Apr 17, 2014, at 3:13 PM, Kasper Nielsen <kasperni at gmail.com> wrote:
> Hi,
>
> I'm trying to build a small test suite for for a custom stream
> implementation I'm making.
> And I found a couple of small issues with java.util.stream.Stream. Nothing
> major but might be worth fixing
>
> 1)
> There are couple of places where null checks are missing
>
> *Stream.close
> Int/Double/LongStream.flatmap
> Int/Double/LongStream.collect(x,y, 3rd) 3rd argument not being checked
>
>
> 2)
> These methods does throw NPE but they consume the stream before throwing.
> I like to think of null parameter checks as side-effect free.
>
> Stream.forEach
> Stream.forEachOrdered
> Stream.sorted
> Stream.toArray
>
I see you logged a bug (thanks for doing that):
https://bugs.openjdk.java.net/browse/JDK-8044047
For 1) I presume you mean BaseStream.onClose rather than BaseStream.close?
For 2) i am not sure it is worth enforcing, specification-wise. It's hard to envisage how a client would recover and reuse the stream in such scenarios, and even if it were the case it seems a very minor one. Currently the implementation is free to consolidate checks, even if there are side-effects before those checks occur.
> 3)
> LongStream.Average does not always work as intended with high long values
>
> Arrays.*asList*(Long.*MAX_VALUE* - 1000L, Long.*MAX_VALUE* -
> 1000L).stream().mapToLong(e -> e).average().getAsDouble; return -1001.0
>
> Same thing with SummaryStatistics
>
Right, we don't check for overflow of the sum. That is stated on the *SummaryStatistics class docs, but not in the Int/LongStream.sum/average method. I think we should add an @implNote to those methods.
Paul.
More information about the core-libs-dev
mailing list