Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java流数字到数字_Java_Java Stream_Biginteger - Fatal编程技术网

Java流数字到数字

Java流数字到数字,java,java-stream,biginteger,Java,Java Stream,Biginteger,我正在努力获得一个有效的代码。 我有一个介于0和9之间的数字流。我想从这些数字中得到一个biginger。 例如: 有没有一种方法可以连接流外的所有元素? 以下是我的基本想法: digits.forEach(element -> result=result.concat(result, element.toString())); 您可以将每个数字映射到一个字符串,将它们连接在一起,然后从中创建一个biginger: BigInteger result = IntStream.of

我正在努力获得一个有效的代码。 我有一个介于0和9之间的数字流。我想从这些数字中得到一个
biginger
。 例如:

有没有一种方法可以连接流外的所有元素? 以下是我的基本想法:

digits.forEach(element -> result=result.concat(result, element.toString()));

您可以将每个数字映射到一个字符串,将它们连接在一起,然后从中创建一个
biginger

BigInteger result =
    IntStream.of(1, 2, 3)
             .mapToObj(String::valueOf)
             .collect(Collectors.collectingAndThen(Collectors.joining(), 
                                                    BigInteger::new));

您可以按如下方式减少:

BigInteger big1 = IntStream.of(1, 2, 3, 4, 5, 6, 7, 8, 9)
    .mapToObj(BigInteger::valueOf)
    .sequential() // if parallel, reduce would return sweet potatoes
    .reduce((a, b) -> a.multiply(BigInteger.TEN).add(b))
    .orElse(BigInteger.ZERO);

System.out.println(big1); // 123456789
尽管我认为最好创建一个
字符串
,并将其用作
biginger
的构造函数的参数,就像@Mureinik的回答一样。在这里,我使用的变体不会为每个数字创建
字符串
对象:

String digits = IntStream.of(1, 2, 3, 4, 5, 6, 7, 8, 9)
    .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append)
    .toString();
BigInteger big2 = new BigInteger(digits);

System.out.println(big2); // 123456789

您做得还不算太糟,我建议您使用
forEachOrdered
,因为
forEach
不能保证并行流的顺序,也不能保证将其收集到
StringBuilder
。比如:

IntStream digits = IntStream.of(1, 2, 3);
StringBuilder sb = new StringBuilder();
digits.forEachOrdered(sb::append);
System.out.println(new BigInteger(sb.toString()));
这是我们的解决方案

或者,如果可能的话,我们应该删除前缀“0”

BigInteger res = new BigInteger(IntStreamEx.of(0, 1, 2).dropWhile(i -> i == 0).joining(""));
也许我们应该添加对空流的检查:

String str = IntStreamEx.of(0, 1, 2).dropWhile(i -> i == 0).joining("")
BigInteger res = str.length() == 0 ? BigInteger.ZERO : new BigInteger(str);

看起来不错,很有意义,但我得到的是“构造函数BigInteger(对象)未定义”。此外,如果流的数字超过9,我需要添加一个断言。但是如果我在那之前检查流,它就关闭了,我不能再使用它了。思想?
BigInteger res = new BigInteger(IntStreamEx.of(0, 1, 2).dropWhile(i -> i == 0).joining(""));
String str = IntStreamEx.of(0, 1, 2).dropWhile(i -> i == 0).joining("")
BigInteger res = str.length() == 0 ? BigInteger.ZERO : new BigInteger(str);