如何使用java stream API生成IntStream

时间:2015-10-25 12:22:39

标签: java loops java-8 java-stream

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

while(D>month)
{
    M++;
    D-=31;
}

我尝试使用int n = someFunction(); // n > 0 for (int i = 3; i * i <= n; i += 2) System.out.print(i); ,但我无法添加停止条件。

据我所知,我不能在这里使用IntStream.iterate(3, i -> i + 2)方法。

有什么想法吗?

2 个答案:

答案 0 :(得分:5)

您可以使用limit(int):您需要确定3到sqrt(n)之间的元素数量,步长为2.确切地说有(sqrt(n) - 3) / 2 + 1个元素,所以你可以写:

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)

答案 1 :(得分:3)

使用我的免费StreamEx库除了@Tunaki答案中提出的解决方案外,还可以提供两种解决方案。

  1. 使用JDK-9中出现的takeWhile方法的backport:

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