Java-Stream實(shí)現(xiàn)生成質(zhì)數(shù)的無(wú)限流

思路:
使用Strream.generate方法

代碼實(shí)現(xiàn)IntSupplier,而不是用Lambda表達(dá)式,是為了在get方法外定義共有變量用于存儲(chǔ)已有質(zhì)數(shù)列表。
當(dāng)調(diào)用forEach進(jìn)行流運(yùn)算時(shí),底層是不斷調(diào)用primeSupplier的getAsInt()方法,在每調(diào)用一次就生成一個(gè)新質(zhì)數(shù),并且加到質(zhì)數(shù)列表變量中。

如果直接使用Lambda表達(dá)式,那() -> {} ,括號(hào)內(nèi)部是getAsInt()的方法實(shí)現(xiàn),無(wú)法在內(nèi)部類定義公有變量。那么就只能在外部定義公有變量了,這樣做就不優(yōu)雅了。

        // 埃氏篩選法找質(zhì)數(shù)
        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);


運(yùn)行結(jié)果:

2
3
5
7
11
13
17
19
23
29
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容