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