2015-10-25 7 views
5

を使用してIntStreamを生成する方法:私は新しいJavaストリームAPIでこのコードを置き換えることができますどのように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)を使用することができます:あなたが書くことができるので、正確に(sqrt(n) - 3)/2 + 1の要素がありますどのように多くの要素2の段階で3とsqrt(n)の間であることを行っているかを決定しなければならない:

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

は言いましたことを、あなたもこのように、3からsqrt(n)に閉じた範囲を作成し、偶数値をフィルタリングできます。私の自由StreamExライブラリを使用して

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

IntStream is = IntStreamEx.iterate(3, i -> i + 2).takeWhile(i -> i*i <= n); 
  • ステップを指定することができ、三引数IntStreamEx.rangeClosedを使用して問題はJava 9で解決されます:http://stackoverflow.com/questions/20746429/limit-a-stream-by-a-predicate –

  • +2

    レンジバージョンはまた、より良い並列動作を提供します(2つの理由により、並列リミットは高価で、iterate()はストリームソースを生成するための根本的に逐次的な方法です)。 –

    2

    さらに2つのソリューションがpossiあります@朱雀の答えで提案されているものに加えてble。

    1. 使用JDK-9に表示されますtakeWhile方法のバックポート:どうやらこの

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