前面花了大量篇幅介绍布尔类型及相应的关系运算和逻辑运算,那可不仅仅是为了求真值或假值,更是为了通过布尔值控制流程的走向。在现实生活中,常常需要在岔路口抉择走去何方,往南还是往北,向东还是向西?在Java编程中,利用if语句可判断接下来要做什么,比如说:如果某个条件成立,就进行某种处理;否则的话,就进行另一种处理。if语句的具体格式为“if (条件) { /* 条件成立时的操作代码 */ } else { /* 条件不成立时的操作代码 */ }”,其中后面的else分支是可选的,下面是个if判断的简单代码示例:

		System.out.println("凉风有信,秋月无边。打二字");
System.out.println("获取“凉风有信”的谜底请按1,获取“秋月无边”的谜底请按2");
Scanner scan = new Scanner(System.in); // 从控制台接收输入文本
/* nextLine方法表示接收一行文字,以回车键结尾 */
int seq = scan.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) {
seq = 1;
} else {
seq = 2;
}

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

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

改写后的代码仅有一行而已,尽管未出现if和else的身影,但它仍是一种从条件语句简化来的条件运算符。
当然,运算符“?:”最终是为了得到条件判断的运算结果,倘若业务逻辑并不要求返回什么数值,而是要求执行某项动作(比如打印日志),那么这个三元运算符便不再使用了。例如,前面的文字猜谜游戏,假设不需要对变量seq进行数值转换,而是发现非1数字时直接打印“秋月无边”的谜底,则应当书写完整的if/else语句,不可也无法再套用运算符“?:”。此时修改后的代码就变成下面这样了:

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

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

Java开发笔记(十六)非此即彼的条件分支的更多相关文章

  1. Java开发笔记(六十)匿名内部类的优势

    前面依次介绍了简单接口和扩展接口,给出的范例都是自定义的接口代码,其实Java系统本身就自带了若干行为接口,为了更好地理解系统接口的详细用法,接下来还是从一个基础的例子出发,抽丝剥茧地逐步说明接口的几 ...

  2. Java开发笔记(六十二)如何定义函数式接口

    前面介绍了Lambda表达式的用法,从实践中发现它确实极大地方便了开发者,然而不管是匿名内部类还是Lambda表达式,所举的例子都离不开各类数组的排序方法,倘使Lambda表达式仅能用于sort方法, ...

  3. Java开发笔记(六十四)静态方法引用和实例方法引用

    前面介绍了方法引用的概念及其业务场景,虽然在所列举的案例之中方法引用确实好用,但是显而易见这些案例的适用场合非常狭窄,因为被引用的方法必须属于外层匿名方法(即Lambda表达式)的数据类型,像isEm ...

  4. Java开发笔记(六十五)集合:HashSet和TreeSet

    对于相同类型的一组数据,虽然Java已经提供了数组加以表达,但是数组的结构实在太简单了,第一它无法直接添加新元素,第二它只能按照线性排列,故而数组用于基本的操作倒还凑合,若要用于复杂的处理就无法胜任了 ...

  5. Java开发笔记(六十六)映射:HashMap和TreeMap

    前面介绍了两种集合的用法,它们的共性为每个元素都是唯一的,区别在于一个无序一个有序.虽说往集合里面保存数据还算容易,但要从集合中取出数据就没那么方便了,因为集合居然不提供get方法,没有get方法怎么 ...

  6. Java开发笔记(六十八)从泛型方法探究泛型的起源

    前面介绍各种容器之时,通过在容器名称后面添加包裹数据类型的一对尖括号,表示该容器存放的是哪种类型的元素.这样一来总算把Java当中的各类括号都凑齐了,例如包裹一段代码的花括号.指定数组元素下标的方括号 ...

  7. Java开发笔记(六十九)泛型类的定义及其运用

    前面从泛型方法的用法介绍到了泛型的起源,既然单个方法允许拥有泛化的参数类型,那么一个类也应当支持类级别的泛化类型,例如各种容器类型ArrayList.HashMap等等.一旦某个类的定义代码在类名称后 ...

  8. Java开发笔记(六十一)Lambda表达式

    前面介绍了匿名内部类的简单用法,通过在sort方法中运用匿名内部类,不但能够简化代码数量,还能保持业务代码的连续性.只是匿名内部类的结构仍显啰嗦,虽然它省去了内部类的名称,但是花括号里面的方法定义代码 ...

  9. Java开发笔记(六十三)双冒号标记的方法引用

    前面介绍了如何自己定义函数式接口,本文接续函数式接口的实现原理,阐述它在数组处理中的实际应用.数组工具Arrays提供了sort方法用于数组元素排序,可是并未提供更丰富的数组加工操作,比如从某个字符串 ...

  10. Java开发笔记(六十七)清单:ArrayList和LinkedList

    前面介绍了集合与映射两类容器,它们的共同特点是每个元素都是唯一的,并且采用二叉树方式的类型还自带有序性.然而这两个特点也存在弊端:其一,为啥内部元素必须是唯一的呢?像手机店卖出了两部Mate20,虽然 ...

随机推荐

  1. js生成自定义随机数方法

    function getRandom() { var chars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', ...

  2. SSIS - 9.文件系统任务

    文件系统任务是用来操作服务器上的文件和目录的.比如,可以新建任务来创建.复制.删除或移动一个文件或一个目录. 一.操作和属性 一个文件系统可以定义如下10种操作. 所有的操作包含Name, Descr ...

  3. 企业IT管理员IE11升级指南【8】—— Win7 IE8和Win7 IE11对比

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  4. CSS3 阴影模拟灯照效果

    效果如下: 代码如下: <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset= ...

  5. [Swift]LeetCode63. 不同路径 II | Unique Paths II

    A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). The ...

  6. 使用jquery日期选择器flatpickr.js,使用js动态创建input元素时插件失效

    最近写页面时需要用到,日期选择器,网上搜索了一些插件,最后使用了flatpickr.js.我是从npm 上拉下的依赖  npm install flatpickr --save 随后在页面中引入css ...

  7. 英语笔记3(git)

    一: To create a new branch and switch to it at the same time, you can run the git checkout command wi ...

  8. HBase之行信息简析

    这一节我们简单介绍一下HBase的行信息.文章前半部分会对照源码介绍,后面会有我自己画的图,大家如果对这些信息已经比较了解了,跳过源码对照部分看后面的图,加深一下印象. 下面简单分析一下HBase中对 ...

  9. java自动拆装箱(转载)

    转载自:http://www.cnblogs.com/dolphin0520/p/3780005.html 注意:Integer的缓存机制.

  10. Python内置函数(50)——print

    英文文档: print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False) Print objects to the text str ...