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
已经足够了。