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

思路:
使用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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。