import static java.util.stream.IntStream.range;
import static java.util.stream.LongStream.rangeClosed;
import static java.lang.Math.sqrt;
class PrimesCounter {
private final static int MAX = 1000000;
private long countPrimes(int max, boolean parallel) {
return !parallel ? range(1, max).filter(this::isPrime).count() :
range(1, max).parallel().filter(this::isPrime).count();
}
private boolean isPrime(long n) {
return n > 1 && rangeClosed(2, (long) sqrt(n)).noneMatch(divisor -> n % divisor == 0);
}
public static void main(String[] args) {
long start;
long count;
long elapsed;
PrimesCounter app = new PrimesCounter();
start = System.nanoTime();
System.out.println("Looking for primes below" + MAX);
count = app.countPrimes(MAX, false);
elapsed = System.nanoTime() - start;
System.out.println("Found " + count + " in " + elapsed/1000000 + "ms");
start = System.nanoTime();
System.out.println("Looking for primes in parallel");
count = app.countPrimes(MAX, true);
elapsed = System.nanoTime() - start;
System.out.println("Found " + count + " in " + elapsed/1000000 + "ms");
}
}