thinking in java 第四章笔记及思考:途经 控制执行流程

  还是老规矩:太基础的就不罗列了,但是本章好像都是基础知识,感觉没有可以讲的部分,但是也不会令你失望。后面章节内容难懂,可能就会有更多书上的有趣内容与大家一块讨论。本系列博客旨在挖掘这本书新奇、难点内容。当然可能会忽略一些重要知识点,欢迎补充、讨论、提建议。也欢迎大家提出批评。共勉!
  本章开篇第一句话:就像有知觉的生物一样,程序必须在执行过程中控制它的世界,并作出选择。在Java中,你要使用执行控制语句来做出选择。

1.java不允许我们将一个数字作为布尔值使用!
  按理说数字数字例子如下:
这里写图片描述
  错误原因:不能讲int转换成Boolean
  当然char类型也是不可以的。这个与switch不同,switch可以接受int、char、String类型。
这里写图片描述

2.while、do-while、for用来控制循环。有时候将他们划分为迭代语句。
  迭代的意思是:循环重复的进行某一操作。
  里边有一个例子:产生0~1的随机数,当产生的随机数大于0.99时就终止。我们以这个例子谈谈书中的代码规范。

public class WhileTest {
    public static int count = 0;
    /** 判断产生随机数是否大于0.99 */
    static boolean condition() {
        boolean result = Math.random() < 0.99;
        System.out.print(result + ", ");
        return result;
    }

    public static void main(String[] args) {
        while (condition()) {
            System.out.println(count + " : Inside 'while'");
            count++;
        }
        System.out.println("Exited 'while'");
        productNumber();
    }

    /** 对产生的随机数打印,大于0.99时退出  */
    public static void productNumber() {
        double num;
        for(int i = 0; i < 1000; i++) {
            num = Math.random();
            if(num > 0.99) {
                System.out.println(count + " : " + num);
                break;
            }
            else {
                System.out.println(count + " : " + num);
                count++;
            }
        }
    }
}

  很多时候刚接触程序的新手会直接在main方法里边写所有的功能,这个规范吗?因为这只是一个简单的生成随机数功能,代码量不多。但是要是代码量很多呢?是不是显得特别臃肿?
  我们可以发现书中把判断生成随机数这个时间独立成了一个函数。
  看过clean code的人应该了解:函数应该短小,一个函数只做一件事。一个函数做的事情不止一件就应该重构、抽方法。所以以后再遇到,能拆解出函数就拆解。我前段时间做的一个项目,主要就是拿前端客户编辑的对象来更新数据库里边的对象,要记录新旧对象的差异,就比对差异这个模块我用了一个函数300行左右,看的很难受。重构了几十个函数,基本一个函数只有不到10行,逻辑清晰。展示如下
  重构前(部分代码,整个函数300多行):
  这里写图片描述
  重构后(整个类中都是这么简短的函数,虽然重构后有400多行,但是逻辑确实简单多了):
  这里写图片描述

3.当然if语句很好用,但是很所时候项目中出现太多的if判断语句的时候不太好(个人观点),能少则少。这个时候java8推出的一个流的新特性,可以用filter过滤数据,减少if语句,只能用于List数组。
  举个项目中的例子(截取代码,不需要仔细看,目的在于用java8处理的好处):SpInfo对象包含List属性,可以说他们是聚合关系。可以看出用java 8一行代码搞定,而用流程控制优势for,又是if。

/** */
List<SpRule> newSpRules = new ArrayList<>();
for(SpRule spRule : spInfo.getSpRuleList()){
    if(null == map.get(spRule.getId().toString())){
        newSpRules.add(spRule);
    }
}

/** 判断一个SpRule 里边的属性id是否存在*/
List<SpRule> newSpRules = spInfo.getSpRuleList().stream()
                    .filter(spRule -> null == map.get(spRule.getId().toString()))
                    .collect(Collectors.toList());

4.return 有两方面的用途:
  i.返回一个值
  ii.表示即将退出该函数(结束该函数的执行)

5.对于课本后面的裴波那切和吸血鬼数字的代码如下(自我感觉吸血鬼数字的代码特别费劲,太愚蠢,如果是6位数呢?这个代码实用性不强,局限性比较明显。全用if而不是用if…else是为了让所有的逻辑在一个层面上,代码看起来简洁清晰):

package aa.thinking.in.java.three;

public class Test {
    public static void main(String[] args) {
        getPebonachetNumber(15);
        System.out.println();
        getBloodNumber();
    }

    /**
     * 打印菲波那切数列
     * 1   1   2   3   5   8  13  21  34  55 
     * @param num
     */
    public static void getPebonachetNumber(int num) {
        int left = 1;
        int right = 1;
        for(int i = 1; i <= num; i++) {
            if(1 == i) {
                System.out.printf("%3d ", + left);
            }
            if(2 == i) {
                System.out.printf("%3d ", + right);
            }
            if(1 !=i && 2!= i) {
                right = right + left;
                left = right - left;
                System.out.printf("%3d ", + right);
            }
        }
    }

    /**
     * 得到4位数的吸血鬼数字
     * 
     */
    public static void getBloodNumber() {
        for(int number = 1000; number < 9999; number++) {
            String[] strs = new String[4];
            //拆数字
            int temp = number;
            for(int i = 0; i < 4; i++) {
                strs[i] = String.valueOf(temp % 10);
                temp = (temp / 10);
            }
            estimateBloodNumber(number,strs);
        }
    }

    public static void estimateBloodNumber(int num, String[] strs){
        if(num == Integer.parseInt(strs[0].concat(strs[1])) * Integer.parseInt(strs[2].concat(strs[3]))) {
            System.out.println("吸血鬼数字  :" + num + " = " + Integer.parseInt(strs[0].concat(strs[1])) + " X " + Integer.parseInt(strs[2].concat(strs[3])));
            return;
        }
        if(num == Integer.parseInt(strs[0].concat(strs[1])) * Integer.parseInt(strs[3].concat(strs[2]))) {
            System.out.println("吸血鬼数字  :" + num + " = " + Integer.parseInt(strs[0].concat(strs[1])) + " X " + Integer.parseInt(strs[3].concat(strs[2])));
            return;
        }
        if(num == Integer.parseInt(strs[1].concat(strs[0])) * Integer.parseInt(strs[2].concat(strs[3]))) {
            System.out.println("吸血鬼数字  :" + num + " = " + Integer.parseInt(strs[1].concat(strs[0])) + " X " + Integer.parseInt(strs[2].concat(strs[3])));
            return;
        }
        if(num == Integer.parseInt(strs[1].concat(strs[0])) * Integer.parseInt(strs[3].concat(strs[2]))) {
            System.out.println("吸血鬼数字  :" + num + " = " + Integer.parseInt(strs[1].concat(strs[0])) + " X " + Integer.parseInt(strs[3].concat(strs[2])));
            return;
        }

        if(num == Integer.parseInt(strs[0].concat(strs[2])) * Integer.parseInt(strs[1].concat(strs[3]))) {
            System.out.println("吸血鬼数字  :" + num);
            return;
        }
        if(num == Integer.parseInt(strs[0].concat(strs[2])) * Integer.parseInt(strs[3].concat(strs[1]))) {
            System.out.println("吸血鬼数字  :" + num);
            return;
        }
        if(num == Integer.parseInt(strs[2].concat(strs[0])) * Integer.parseInt(strs[1].concat(strs[3]))) {
            System.out.println("吸血鬼数字  :" + num);
            return;
        }
        if(num == Integer.parseInt(strs[2].concat(strs[0])) * Integer.parseInt(strs[3].concat(strs[1]))) {
            System.out.println("吸血鬼数字  :" + num);
            return;
        }

        if(num == Integer.parseInt(strs[0].concat(strs[3])) * Integer.parseInt(strs[1].concat(strs[2]))) {
            System.out.println("吸血鬼数字  :" + num);
            return;
        }
        if(num == Integer.parseInt(strs[0].concat(strs[3])) * Integer.parseInt(strs[2].concat(strs[1]))) {
            System.out.println("吸血鬼数字  :" + num);
            return;
        }
        if(num == Integer.parseInt(strs[3].concat(strs[0])) * Integer.parseInt(strs[1].concat(strs[2]))) {
            System.out.println("吸血鬼数字  :" + num);
            return;
        }
        if(num == Integer.parseInt(strs[3].concat(strs[0])) * Integer.parseInt(strs[2].concat(strs[1]))) {
            System.out.println("吸血鬼数字  :" + num);
            return;
        }
    }
}

                                  2018.8.22
                                  于 上海 静安

猜你喜欢

转载自blog.csdn.net/u010986518/article/details/81941413