【问题标题】:How to create BigDecimal stream from String array in Java 8?如何从 Java 8 中的字符串数组创建 BigDecimal 流?
【发布时间】:2026-01-09 23:35:01
【问题描述】:

我的任务是订购 BigDecimals 作为字符串数组。我的想法是使用BigDecimal的String参数构造函数,然后排序,然后用forEach打印出来。这是代码部分:

Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String[] s = new String[n + 2];
for (int i = 0; i < n; i++) {
    s[i] = sc.next();
}
Stream.of(s)
    .map(i -> new BigDecimal(i))
    .sorted((bg1, bg2) -> bg1.compareTo(bg2))
    .forEach(System.out::println);            //line 22

但我得到了 forEach 行的 NullPointerException:

Exception in thread "main" java.lang.NullPointerException
    at java.math.BigDecimal.<init>(BigDecimal.java:806)
    at Solution.lambda$main$1(Solution.java:20)
    at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
    at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
    at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
    at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
    at Solution.main(Solution.java:22)

我期待收到流专家的意见。
谢谢!

【问题讨论】:

  • 您正在将数组填充到第 n 个元素,但您的 String[] 的大小为 n + 2。所以最后两个元素是默认的null。最好将 s.length 写为 for 循环中的谓词。
  • 谢谢!扫描部分也给出了。而且我也不知道如何调试流...

标签: foreach java-8 java-stream bigdecimal


【解决方案1】:

您已将s 数组声明为n + 2 元素,但您只填充了第一个n。因此,当流到达最后两个元素时,您会失败,因为 BigDecimal 不接受 null 作为构造函数参数。

您可以仅使用 n 元素 (new String[n]) 创建数组,也可以使用以下方式流式传输第一个 n 元素:

Arrays.stream(s, 0, n)

您还可以将流简化为:

Arrays.stream(s, 0, n)
      .map(BigDecimal::new)
      .sorted()
      .forEachOrdered(System.out::println);

请注意,如果您想确保输出是有序的,您应该真正使用forEachOrdered

【讨论】:

  • 也谢谢你!主要是为了引起我对 forEachOrdered 的注意。我错误地写了自然顺序,但我需要它反转,所以我将 .sorted() 替换为 .sorted(Comparator.reverseOrder())