2015-10-25 45 views
5

我怎麼能與新的Java API流替換此代碼來生成IntStream:如何使用Java API流

int n = someFunction(); // n > 0 
for (int i = 3; i * i <= n; i += 2) 
    System.out.print(i); 

我試圖使用IntStream.iterate(3, i -> i + 2),但我不能添加停止條件。

據我所知,我不能在這裏使用.limit(int)方法。

任何想法?

回答

5

你可以使用limit(int):你必須確定有多少元素會通過2步正好有(sqrt(n) - 3)/2 + 1元素是3和sqrt(n)之間,所以你可以寫:

IntStream.iterate(3, i -> i + 2).limit((int) (Math.sqrt(n) - 3)/2 + 1); 

說罷如此,您還可以創建一個封閉的範圍爲3至sqrt(n)並篩選出偶數值,如:

IntStream.rangeClosed(3, (int) Math.sqrt(n)).filter(i -> i % 2 > 0) 
+2

顯然,這問題將在Java 9中解決:http://stackoverflow.com/questions/20746429/limit-a-stream-by-a-predicate –

+2

範圍版本也會給你更好的並行行爲(出於兩個原因;並行限制是昂貴的,iterate()是生成流源的基本順序方法。) –

2

用我的自由StreamEx庫兩個解決方案possi除了在@Tunaki答案中提出的內容之外。

  1. 使用takeWhile方法的反向移植出現在JDK-9:

    IntStream is = IntStreamEx.iterate(3, i -> i + 2).takeWhile(i -> i*i <= n); 
    
  2. 使用三個參數的IntStreamEx.rangeClosed,其允許指定步驟:

    IntStream is = IntStreamEx.rangeClosed(3, (int) Math.sqrt(n), 2);