前面花了大量篇幅介绍布尔类型及相应的关系运算和逻辑运算,那可不仅仅是为了求真值或假值,更是为了通过布尔值控制流程的走向。在现实生活中,常常需要在岔路口抉择走去何方,往南还是往北,向东还是向西?在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. JetBrains系列IDE快捷键大全(转载)

    编辑 快捷键组合 说明 Ctrl + Space 代码自动完成提示(选择) Alt + Enter 显示意图动作和快速修复 Ctrl + P 参数信息 (在调用方法参数忘记的时候,提示) Ctrl + ...

  2. 关于如何在Visual Studio上仿真调试安卓的U3D应用

    正巧最近需要开发一个安卓手机上的Unity3D游戏功能,想着既然要开发么,当然需要调试.本来的话一些基础功能是不需要使用仿真模拟器,直接在U3D的开发编辑器上就能调试,不过有一些安卓上才能执行,比如 ...

  3. cadence PCB板级设计

    总结PCB板框设计,定位孔的放置,以及布线区域和元件放置区域的放置,最重要的是层叠结构的设计.

  4. nginx获取上游真实IP(ngx_http_realip_module)

    realip模块的作用是:当本机的nginx处于一个反向代理的后端时获取到真实的用户IP,如果没有realip模块,nginx的access_log里记录的IP会是反向代理服务器的IP,PHP中$_S ...

  5. LAMP构架搭建论坛

    安装MYSQL数据库服务程序       LAMP动态网站部署架构是一套由Linux+Nginx+MYSQL+PHP组成的动态网站系统解决方案,具有免费.高效.扩展性强且资源消耗低等优良特性.使用手工 ...

  6. 【RL-TCPnet网络教程】第34章 RL-TCPnet之SMTP客户端

    第34章      RL-TCPnet之SMTP客户端 本章节为大家讲解RL-TCPnet的SMTP应用,学习本章节前,务必要优先学习第33章的SMTP基础知识.有了这些基础知识之后,再搞本章节会有事 ...

  7. [Swift]LeetCode440. 字典序的第K小数字 | K-th Smallest in Lexicographical Order

    Given integers n and k, find the lexicographically k-th smallest integer in the range from 1 to n. N ...

  8. 主机名变成bogon?连不上mysql?你需要看下这篇文章

    通过navicat for mysql操作部署在虚拟机centos里面的mysql数据库时候总是出现类似于下面的提示信息: Can't connct to MySQL server on '*.*.* ...

  9. 【tiles】简单使用总结

    一.简介 tiles是一种JSP布局框架,主要目的是为了将复杂的JSP页面作为一个页面的部分机能,然后组合成一个最终的页面,这种做法便于对各个页面机能的变更和维护,减少代码量,实现代码的重用. til ...

  10. 【Spark调优】提交job资源参数调优

    [场景] Spark提交作业job的时候要指定该job可以使用的CPU.内存等资源参数,生产环境中,任务资源分配不足会导致该job执行中断.失败等问题,所以对Spark的job资源参数分配调优非常重要 ...