Поведение соответствует тому, что вы получаете при суммировании int
s в цикле. Существуют различные способы борьбы с переполнением, все из которых являются компромиссом между общей применимостью и производительностью, и поскольку неясно, какой из них будет использовать/должен использовать API, тот, который широко известен разработчикам Java, был выбран ,
Если вы хотите суммировать, используя больший тип данных, вы можете использовать либо
long sumL=IntStream.of(A).asLongStream().sum();// may still overflow
или
BigInteger sum = IntStream.of(A).mapToObj(BigInteger::valueOf)
.reduce(BigInteger.ZERO, BigInteger::add);// might be slower
Если вы хотите бросить поведение, вы можете использовать
int sum=IntStream.of(A).reduce(0, (a,b)->{
int c=a+b;
if(a>0? b>0 && c<0: b<0&& c>0)
throw new ArithmeticException("overflow");
return c;
});
или, что намного проще (интеграция решения Stuart Marks)
int sum=IntStream.of(A).reduce(0, Math::addExact);
Почему бы исключение бросить?Если вам нужно «долго», вам придется [конвертировать в «LongStream»] (http://docs.oracle.com/javase/8/docs/api/java/util/stream/IntStream.html#asLongStream- -). –
Использовать LongStream? –