stream是jdk1.8新增加的一个功能,可以大大的简化代码,尤其是在我做codewars中经常看到自己用10行左右实现的功能,别人通过stream一行就实现了,因此非常的羡慕嫉妒恨,(如果想要了解了解stream的基本使用,可以进入这个网址https://blog.csdn.net/u010425776/article/details/52344425,个人感觉讲的是比较通俗易懂的,看了很多其他的教程理论性比较强,不容易懂)
这次要实现的是codewar上的一道题,使用流的方式来获取质数序列,因为没怎么发过文章,所以直接将代码贴出来
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.IntUnaryOperator;
import java.util.stream.IntStream;
public class Primes {
public static IntStream stream() {
return IntStream.iterate(2, new IntUnaryOperator() {
List<Integer> list = new ArrayList<Integer>();//用于放置获取的质数
@Override
public int applyAsInt(int operand) {
list.add(new Integer(operand));
if (operand % 6 == 5) {
if (isPrime(operand + 2))
return operand + 2;
else
operand += 6;
} else if (operand % 6 == 1) {
operand += 4;
} else if (operand == 2) {
return 3;
} else if (operand == 3) {
return 5;
}
//除了2,3的所有质数一定出现在在6的倍数的左右两边
// 6x 6x+1 6x+2 6x+3 6x+4 6x+5->2*3x 6x+1 2*(3x+1) 3*(2x+1) 2*(3x+2) 6x+5
for (int i = operand;; i += 6) {
if (isPrime(i))
return i;
else if (isPrime(i + 2))
return i + 2;
}
}
//判断是否为质数 只需要计算是否能被前面的质数整除即可
public boolean isPrime(int n) {
int abs = (int) Math.sqrt(n);
int size = list.size();
for(int i=0;i<size;i++){
int p = list.get(i).intValue();
if(n%p==0) return false;
if(p>abs) break;
}
return true;
}
});
}
//计算出百万级质数所需的是按
public static void main(String[] args) {
long start = System.currentTimeMillis();
int[] arr = Primes.stream().limit(1000000).toArray();
long end = System.currentTimeMillis();
System.out.println((double)(end-start)/1000+"s");
System.out.println(Arrays.toString(arr));//打印数组可能花费大量的时间
}
}
当然有更加简化的一些解决办法,但因为是其他人实现的,就算了,如果想看的话,可以去codewars中寻找,当然先要做出来这道题才能看到,这道题的题目为"Prime Streaming (PG-13)".