繁体   English   中英

如何使用java stream API生成IntStream

[英]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答案中提出的解决方案之外,还可以提供两种解决方案。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM