如何在Java 8中从String数组创建BigDecimal流?

时间:2016-05-14 13:40:29

标签: foreach java-8 java-stream bigdecimal

我的任务是命令以String数组的形式给出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)

我期待听到溪流专家的意见 谢谢!

1 个答案:

答案 0 :(得分:4)

您已将rails s --help数组声明为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);