Java-Stream实现生成质数的无限流

2021-04-15  本文已影响0人  _Zy

思路:
使用Strream.generate方法

代码实现IntSupplier,而不是用Lambda表达式,是为了在get方法外定义共有变量用于存储已有质数列表。
当调用forEach进行流运算时,底层是不断调用primeSupplier的getAsInt()方法,在每调用一次就生成一个新质数,并且加到质数列表变量中。

如果直接使用Lambda表达式,那() -> {} ,括号内部是getAsInt()的方法实现,无法在内部类定义公有变量。那么就只能在外部定义公有变量了,这样做就不优雅了。

        // 埃氏筛选法找质数
        IntSupplier primeSupplier = new IntSupplier() {
            private int currPrime = 2;
            private List<Integer> primeList = new ArrayList<>();
            @Override
            public int getAsInt() {
                if(!primeList.isEmpty()){
                    boolean notFind = true;
                    while(notFind){
                        currPrime++;
                        notFind = primeList.stream().anyMatch(n -> currPrime%n==0);
                    }
                }
                primeList.add(currPrime);
                return currPrime;
            }
        };
        IntStream.generate(primeSupplier).limit(10).forEach(System.out::println);

运行结果:

2
3
5
7
11
13
17
19
23
29
上一篇下一篇

猜你喜欢

热点阅读