Можем ли мы использовать IntStream # sum, если сумма элементов больше, чем Integer.MAX_VALUE? - PullRequest
0 голосов
/ 15 сентября 2018

Что происходит, когда сумма элементов в потоке превышает Integer.MAX_VALUE?

int sum = IntStream.of(Integer.MAX_VALUE, 1).sum();

В моем компьютере это возвращает, -(Integer.MAX_VALUE + 1) -> -2147483648

Так, когда не следует использовать java.util.stream.IntStream#sum?

Ответы [ 3 ]

0 голосов
/ 15 сентября 2018

всякий раз, когда любое целое число пересекает максимальное значение, оно начинает отсчитывать от нижней границы целых чисел. Например: если вы напишите Integer.MAX_VAlUE + 10, это даст вам -2147483639. так вот, jvm начал считать с 0 до максимального значения целого числа, а затем, после достижения максимального значения, он начал считать форму (-2147483648, -2147483647, ... до -2147483639)

0 голосов
/ 15 сентября 2018

int + int делает то же самое.Эта проблема не в sum(), а в том, что вы используете слишком ограниченный тип.

long sum = IntStream.of(Integer.MAX_VALUE, 1)
        .asLongStream()
        .sum();
System.out.println(sum);

отпечатки

2147483648

Все типы данных имеют ограничения, и вам необходимо знатьиз них при их использовании.Вы можете утверждать, что было бы лучше, чтобы ошибка создавалась, а не молча давала неожиданный результат, но это не то, как реализованы типы.

0 голосов
/ 15 сентября 2018

Вам следует использовать IntStream # sum, если вы можете либо гарантировать, что ваши значения не превысят максимальное целочисленное значение, либо вы справитесь с переполнением в коде.В противном случае вы можете использовать LongStream, например System.out.println(LongStream.of(Integer.MAX_VALUE, 1).sum());

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...