Instream实现质数序列

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 list = new ArrayList();//用于放置获取的质数
            @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                     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)".

你可能感兴趣的:(java)