繁多准则
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);
// 只会输入
2
3
4
5
range()
办法不会输入最大的数
参考 <<java8 函数式编程 >>