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);