Possible long overflow in Collectors.averagingLong and LongStream.average

Tagir F. Valeev amaembo at gmail.com
Wed Aug 12 08:47:16 UTC 2015


Hello!

The following code prints -1 twice, while users would normally expect
something like 9.223372036854776E18:

double avg1 = Stream.of(Long.MAX_VALUE, Long.MAX_VALUE).collect(
                Collectors.averagingLong(Long::valueOf));
System.out.println(avg1);

double avg2 = LongStream.of(Long.MAX_VALUE, Long.MAX_VALUE).average()
                .getAsDouble();
System.out.println(avg2);

That's because in both cases internally sum is calculated in the long
variable where it may silently overflow. The documentation for both
methods says nothing about such possibility. I guess if it's too late
to fix this behavior, then probably it should be at least properly
documented?

With best regards,
Tagir Valeev.




More information about the core-libs-dev mailing list