我想在流上连续执行以下操作。
1).我想从 2
创建一个数字流至 n
.
我想这可以这样完成:IntStream.range(2, n)
.
2).添加过滤器,只有当这个数字不能被已经通过这个过滤器的任何其他数字整除时,才让这个数字更进一步。
我在实现这样的过滤器时遇到了问题。我想我必须创建一个包含 ArrayList
的匿名类我将把通过这个过滤器的所有数字存储在这个 ArrayList
中.这一切应该看起来像:
IntStream.range(2, n).filter(new IntPredicate() {
ArrayList<Integer> prev;
@Override
public boolean test(int value) {
if (prev == null) {
prev = new ArrayList();
return true;
}
for (int i = 0; i < prev.size(); i++) {
if (value % prev.get(i) == 0) {
return false;
}
}
prev.add(value);
return true;
}
3).得到 Map<Integer, Integer>
,其中键是百(即 100、200、300、400 等),值是每个百中素数的数量。所以一百100
我必须找到 [100, 199] 范围内的质数个数。
我想很明显,在第二步之后,流中只剩下质数。但是我不知道如何执行第三步,也不确定我是否执行了第二步。
你能帮我正确应用所有操作吗?
最佳答案
假设您有一个方法isPrime(int)
(您可以很容易地在网上找到一个实现),下面是对结果进行分组的方法:
IntStream.range(2, n)
.filter(i -> isPrime(i))
.boxed()
.collect(Collectors.groupingBy(i -> i / 100 * 100,
Collectors.summingInt(i -> 1)))
关于java - 如何使用 Java API Streams 执行此类操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48016725/