Здесь пара замечаний:
Метод .nextInt()
возвращает как положительные, так и отрицательные числа. Если вам нужны только положительные значения, вызовите перегруженный метод .nextInt(bound)
с положительной границей. Таким образом, вы можете отбросить отображение x -> Math.abs(x)
.
Тип Integer
ограничен Java. Он имеет строго определенные верхнюю и нижнюю границы:
public static final int MIN_VALUE = -2147483648;
public static final int MAX_VALUE = 2147483647;
Когда вы добавляете два числа и сумма больше, чем MAX_VALUE
, тогда биты overflow
и бит знака изменяются. Таким образом, суммирование двух больших Integer
чисел может привести к отрицательному результату в Java (и не только).
Если вы все еще хотите суммировать такие числа, вы можете использовать BigInteger
вместо Integer
.
Модифицированный код выглядит так:
Stream.generate(() -> new Random().nextInt(Integer.MAX_VALUE))
.limit(100000)
.map(BigInteger::valueOf)
.reduce((a, b) -> {
System.out.println(a);
System.out.println(b);
return a.add(b);
})
.ifPresent(System.out::println);