Java 函数式编程随机 int 流数学 abs 不工作
Java functional programming random int stream math abs not working
我有以下代码:
import java.util.Random;
import java.util.stream.Stream;
public class StreamIntReduce
{
public static void main(String[] args)
{
Stream.generate(() -> new Random().nextInt())
.limit(100000)
.map(x -> Math.abs(x))
.reduce((a,b) -> {
System.out.println(a);
System.out.println(b);
return a + b;
})
.ifPresent(System.out::println);
}
}
我使用 .map(x -> Math.abs(x))
将负数转换为正数。为什么我的输出 System.out.println(a);
和 System.out.println(b);
仍然包含负数?
-1293102468
2036920025
743817557
939157978
1682975535
1444066960
-1167924801
1361593362
193668561
1764534904
1958203465
739693193
-1597070638
这里有几点说明:
方法.nextInt()
returns正数和负数。如果您只需要正值,则调用带有正边界的重载方法 .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);
我有以下代码:
import java.util.Random;
import java.util.stream.Stream;
public class StreamIntReduce
{
public static void main(String[] args)
{
Stream.generate(() -> new Random().nextInt())
.limit(100000)
.map(x -> Math.abs(x))
.reduce((a,b) -> {
System.out.println(a);
System.out.println(b);
return a + b;
})
.ifPresent(System.out::println);
}
}
我使用 .map(x -> Math.abs(x))
将负数转换为正数。为什么我的输出 System.out.println(a);
和 System.out.println(b);
仍然包含负数?
-1293102468
2036920025
743817557
939157978
1682975535
1444066960
-1167924801
1361593362
193668561
1764534904
1958203465
739693193
-1597070638
这里有几点说明:
方法.nextInt()
returns正数和负数。如果您只需要正值,则调用带有正边界的重载方法 .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);