我想在流上连续执行以下操作。

1)。我想创建一个从2n的数字流。

我想这可以做到: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,我必须找到在[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流执行此类操作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48016725/

10-11 20:34
查看更多