Some small issues with the stream library (original) (raw)

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.MAXVALUE - 1000L, Long.MAXVALUE - 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