[英]How to generate IntStream using java stream API
如何用新的Java Stream 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)
:你必须确定3和sqrt(n)
之间的元素数量是2 sqrt(n)
步骤。确切地说(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)
使用我的免费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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.