好好学Java:从零基础到项目实战
上QQ阅读APP看书,第一时间看更新

3.2.1 条件分支

在现实生活中,常常需要在岔路口抉择走去何方,往南还是往北,向东还是向西。在Java编程中,利用if语句可判断接下来要做什么,比如:如果某个条件成立,就执行某种处理;否则执行另一种处理。if语句的具体格式为“if (条件) { /*条件成立时的操作代码*/ } else { /*条件不成立时的操作代码*/ }”,其中后面的else分支是可选的。下面是一个if判断的简单代码示例(完整代码见本章源码的src\com\control\process\Condition.java):

        System.out.println("凉风有信,秋月无边。打二字");
        System.out.println("获取“凉风有信”的谜底请按1,获取“秋月无边”的谜底请按2");
        Scanner scan=new Scanner(System.in);  // 从控制台接收输入文本
        int seq=scan.nextInt();  // nextInt方法表示接收一个整数,以回车键结尾
        if (seq == 1) {  // 按1时打印“凉风有信”的谜底
            System.out.println("凉风有信的谜底是“讽”");
        }
        if (seq == 2) {  // 按2时打印“秋月无边”的谜底
            System.out.println("秋月无边的谜底是“二”");
        }

上面的例子,目的是根据输入的数字来显示对应的谜底,当输入数字1时,日志打印“凉风有信”的谜底;当输入数字2时,日志打印“秋月无边”的谜底。然而,如果输入其他数字,就什么都不打印,这样未免太严格了,不如对所有非1的数字,都自动转换成数字2。此时else分支就派上用场了,凡是非1的数字,自动默认变为数字2。于是,补充了自动转换数字的赋值代码如下:

        if (seq == 1) {  // 为1的情况
            seq=1;
        } else {  // 不为1的情况
            seq=2;
        }

以上的赋值转换代码虽然实现的功能很简单,但是足足占用了5行代码,着实拖泥带水。仔细分析它的代码逻辑,其实包括3个要素,其一为判断条件,其二为条件满足时的赋值,其三为条件不满足时的赋值,因而Java引入了新的三元运算符“?:”加以优化。该运算符的完整形式为“式子A?式子B:式子C”,当式子A成立时,运算结果为B,否则运算结果为C。如此一来,先前的数值转换代码可以改写成下面这样的(完整代码见本章源码的src\com\control\process\Condition2.java):

        // “式子A ? 式子B : 式子C”里的问号加冒号构成了一个三元运算符
        // 当式子A成立时,运算结果为B,否则(式子A不成立)结果为C
        seq=seq==1?1:2;  // 等价于 seq=(seq==1)?1:2

改写后的代码仅有一行而已,尽管未出现if和else的身影,但它是一种从条件语句简化来的条件运算符。

当然,运算符“?:”最终是为了得到条件判断的运算结果,倘若业务逻辑并不要求返回什么数值,而是要求执行某项动作(比如打印日志),那么这个三元运算符便不再适用了。例如,前面的文字猜谜游戏,假设不需要对变量seq转换数值,而是发现非1数字时直接打印“秋月无边”的谜底,则应当书写完整的if/else语句,不可也无法再套用运算符“?:”。此时修改后的代码就变成下面这样了(完整代码见本章源码的src\com\control\process\Condition3.java):

        if (seq == 1) {  // 条件式子为真时,进入if分支处理
            System.out.println("凉风有信的谜底是“讽”");
        } else {  // 否则(条件式子为假),进入else分支处理
            System.out.println("秋月无边的谜底是“二”");
        }

所以,三元运算符“?:”仅适用于需要返回计算结果的场合。