我正在努力为此获得一个正常运行的代码。
我有一个0到9之间的数字流。我想从这些数字中得到BigInteger
。
例如:
IntStream digits = IntStream.of(1, 2, 3) // should get me a Biginteger 123.
IntStream digits = IntStream.of(9, 5, 3) // should get me a Biginteger 953.
有没有办法将所有元素连接到流中? 这是我的基本想法:
digits.forEach(element -> result=result.concat(result, element.toString()));
答案 0 :(得分:4)
您可以将每个数字映射到一个字符串,将它们连接在一起,然后从中创建一个BigInteger
:
BigInteger result =
IntStream.of(1, 2, 3)
.mapToObj(String::valueOf)
.collect(Collectors.collectingAndThen(Collectors.joining(),
BigInteger::new));
答案 1 :(得分:2)
您可以按如下方式减少:
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
虽然我认为最好创建一个String
并将其用作BigInteger
构造函数的参数,就像在@Mureinik的回答中一样。这里我使用的是一个不会在每个数字上创建String
个对象的变体:
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
答案 2 :(得分:2)
你没有做那么糟糕,我建议使用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()));
答案 3 :(得分:1)
以下是StreamEx
的解决方案BigInteger res = new BigInteger(IntStreamEx.of(1, 2, 3).joining(""));
或许我们应该删除前缀' 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);