Java函数式编程随机整数流数学abs不工作

Java函数式编程随机整数流数学abs不工作,java,random,java-8,java-stream,integer-overflow,Java,Random,Java 8,Java Stream,Integer Overflow,我有以下代码: import java.util.Random; 导入java.util.stream.stream; 公共类精简 { 公共静态void main(字符串[]args) { Stream.generate(()->new Random().nextInt()) .限额(100000) .map(x->Math.abs(x)) .减少((a,b)->{ 系统输出打印项次(a); 系统输出打印ln(b); 返回a+b; }) .ifPresent(System.out::printl

我有以下代码:

import java.util.Random;
导入java.util.stream.stream;
公共类精简
{
公共静态void main(字符串[]args)
{
Stream.generate(()->new Random().nextInt())
.限额(100000)
.map(x->Math.abs(x))
.减少((a,b)->{
系统输出打印项次(a);
系统输出打印ln(b);
返回a+b;
})
.ifPresent(System.out::println);
}
}
我使用
.map(x->Math.abs(x))
将负数转换为正数。为什么我的输出
System.out.println(a)
系统输出打印项次(b)仍然包含负数

-1293102468
2036920025
743817557
939157978
1682975535
1444066960
-1167924801
1361593362
193668561
1764534904
1958203465
739693193
-1597070638

这里有几个注意事项:

方法
.nextInt()
同时返回正数和负数。如果只需要正数,则使用正数绑定调用重载方法
.nextInt(bound)
。因此,您可以删除映射
x->Math.abs(x)


Integer
类型在Java中受到限制。它严格定义了上下限:

public static final int MIN_VALUE = -2147483648;
public static final int MAX_VALUE = 2147483647;
当您添加两个数字且总和大于
MAX\u VALUE
时,位
溢出
和符号位会发生变化。因此,在Java中,将两个大的
整数
相加可能会导致负面结果(不仅如此)


如果您仍然想对这样的数字求和,可以使用
biginger
而不是
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);

整数溢出…两个最大值之和integers@AjayReddy不一定是最大整数。实际上,它们都可能比Integer.MAX\u VALUE
.ya.低很多……首先,我只是举了一个简单的例子来理解和使用
longs
返回一个大小的流,这比
generate
+
limit
效率更高,因此,无需对
Integer
进行装箱,也无需将其转换为
BigInteger
,因为
long
已经足够了。