2017-06-03 68 views
3

我很努力得到這個功能的代碼。 我有一個0到9之間的數字流。我想從這些數字中得到一個BigInteger。 例子:Java流數字到數字

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

回答

4

你可以每個數字映射到一個字符串,加入他們一起,然後從它創建一個BigInteger

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

@Eugene很整潔,謝謝!我編輯它在 – Mureinik

+0

看起來不錯,有道理,但我得到「構造函數BigInteger(對象)是未定義的」。另外,如果流的數字大於9,我需要添加一個斷言。但是,如果我在檢查流之前就已經關閉了,我不能再使用它了。想法? –

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的a nswer。在這裏,我使用不創造每一個數字對象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

你沒有這樣做太糟糕了,小的變化,我會使用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())); 
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);