我怎麼能與新的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)
方法。
任何想法?
我怎麼能與新的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)
方法。
任何想法?
你可以使用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)
用我的自由StreamEx庫兩個解決方案possi除了在@Tunaki答案中提出的內容之外。
使用takeWhile
方法的反向移植出現在JDK-9:
IntStream is = IntStreamEx.iterate(3, i -> i + 2).takeWhile(i -> i*i <= n);
使用三個參數的IntStreamEx.rangeClosed
,其允許指定步驟:
IntStream is = IntStreamEx.rangeClosed(3, (int) Math.sqrt(n), 2);
顯然,這問題將在Java 9中解決:http://stackoverflow.com/questions/20746429/limit-a-stream-by-a-predicate –
範圍版本也會給你更好的並行行爲(出於兩個原因;並行限制是昂貴的,iterate()是生成流源的基本順序方法。) –