如何使用java stream API生成IntStream

Dub*_*zar 5 java loops java-8 java-stream

如何用新的Java Stream API替换此代码:

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

我试过用IntStream.iterate(3, i -> i + 2),但我不能添加停止条件.

据我所知,我不能.limit(int)在这里使用方法.

有任何想法吗?

Tun*_*aki 5

你可以使用limit(int):你必须确定3到2之间的元素数量sqrt(n).确切的(sqrt(n) - 3) / 2 + 1元素,所以你可以写:

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

话虽如此,您还可以创建一个从3到3的闭合范围sqrt(n)并过滤掉偶数值,如下所示:

IntStream.rangeClosed(3, (int) Math.sqrt(n)).filter(i -> i % 2 > 0)
Run Code Online (Sandbox Code Playgroud)

  • 显然这个问题将在Java 9中得到解决:http://stackoverflow.com/questions/20746429/limit-a-stream-by-a-predicate (2认同)
  • 范围版本还将为您提供更好的并行行为(出于两个原因;并行限制很昂贵,而iterate()是生成流源的基本顺序方式.) (2认同)