如何使用新的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)
方法。
有什么想法吗?
答案 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答案中提出的解决方案外,还可以提供两种解决方案。
使用JDK-9中出现的takeWhile
方法的backport:
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);