繁多准则
Single responsibility
一个类或模块应仅有一个引起其变动的因素(职责)
一个办法只做一件事
首先看一个计算质数的例子:
/** * 计算给定的数范畴内有多少个质数 * */ public long countPrimes(int max){ long total = 0; for (int i = 2; i <= max ; i++) { boolean isPrime = true; for (int j = 2; j < i ; j++) { if (i % j == 0){ isPrime = false; break; } } if (isPrime){ System.out.println(i); total++; } } return total; }
这个办法中做了两件事,1. 判断是否是质数, 2. 计数
当初把这个办法中判断是否是质数提取进去
/** * 计算给定的数范畴内有多少个质数 * */ public long countPrimes2(int max){ long total = 0; for (int i = 2; i <= max ; i++) { boolean isPrime = isPrime(i); if (isPrime){ System.out.println(i); total++; } } return total; } /** * 判断是否是质数 */ private boolean isPrime(int i) { boolean isPrime = true; for (int j = 2; j < i; j++) { if (i % j == 0) { isPrime = false; break; } } return isPrime; }
这样每个办法只做一件事.然而在java8之后用流代替循环操作.
如果须要对一个很大的数计数,能够并行操作。线程模型也是代码的职责之一!
/** * java8应用流式计算质数个数 * @param max * @return */ public long countPrimes3(int max){ return IntStream.range(2, max) .peek(System.out::println) .filter(this::isPrime8) .count(); } private boolean isPrime8(int num){ boolean flag = IntStream.range(2, num) .anyMatch(j -> num % j == 0); return !flag; }
这里留神和下面略微有点不一样的,IntStream.range(2, max)
蕴含下界不蕴含上届
例如:
IntStream.range(2,6) .forEach(System.out::println);// 只会输入2345
range()
办法不会输入最大的数
参考<<java8函数式编程>>