乐趣区

关于java:单一原则

繁多准则

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 函数式编程 >>

退出移动版