package com.insightfullogic.java8.examples.chapter8; import java.util.stream.IntStream; public class SingleResponsibilityPrinciple { public static interface PrimeCounter { long countPrimes(int upTo); } public static class ImperativeSingleMethodPrimeCounter implements PrimeCounter { @Override // BEGIN imperative_single_method public long countPrimes(int upTo) { long tally = 0; for (int i = 1; i < upTo; i++) { boolean isPrime = true; for (int j = 2; j < i; j++) { if (i % j == 0) { isPrime = false; } } if (isPrime) { tally++; } } return tally; } // END imperative_single_method } public static class ImperativeRefactoredPrimeCounter implements PrimeCounter { @Override // BEGIN imperative_refactored public long countPrimes(int upTo) { long tally = 0; for (int i = 1; i < upTo; i++) { if (isPrime(i)) { tally++; } } return tally; } private boolean isPrime(int number) { for (int i = 2; i < number; i++) { if (number % i == 0) { return false; } } return true; } // END imperative_refactored } public static class FunctionalPrimeCounter implements PrimeCounter { @Override // BEGIN functional public long countPrimes(int upTo) { return IntStream.range(1, upTo) .filter(this::isPrime) .count(); } private boolean isPrime(int number) { return IntStream.range(2, number) .allMatch(x -> (number % x) != 0); } // END functional } public static class ParallelFunctionalPrimeCounter implements PrimeCounter { @Override // BEGIN parallel_functional public long countPrimes(int upTo) { return IntStream.range(1, upTo) .parallel() .filter(this::isPrime) .count(); } private boolean isPrime(int number) { return IntStream.range(2, number) .allMatch(x -> (number % x) != 0); } // END parallel_functional } }