如何使用Java API Streams执行此类操作?

时间:2017-12-29 02:36:09

标签: java java-8 java-stream

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

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,199]范围内的素数数量。

我想非常清楚,在第二步之后,流中只剩下素数。但是我不知道如何执行第三步并且不确定我对第二步的实现。

您能帮我正确应用所有操作吗?

2 个答案:

答案 0 :(得分:5)

假设您有方法isPrime(int)(您可以在线轻松找到实施方案),请按以下步骤对结果进行分组:

IntStream.range(2, n)
        .filter(i -> isPrime(i))
        .boxed()
        .collect(Collectors.groupingBy(i -> i / 100 * 100,
                Collectors.summingInt(i -> 1)))

答案 1 :(得分:1)

我稍微更改了你的代码,因为如果你在循环中检查prev null,那么IntStream就会出错。

您可以运行代码来检查结果。

%filePath%\