来自 编程 2019-09-27 11:02 的文章
当前位置: 澳门三合彩票 > 编程 > 正文

条件不成马上的操作代码,Kotlin对调整语句的管

System.out.println("凉风有信,秋月无边。打二字");System.out.println("获取“凉风有信”的谜底请按1,获取“秋月无边”的谜底请按2");Scanner scan = new Scanner(System.in); // 从控制台接收输入文本/* nextLine方法表示接收一行文字,以回车键结尾 */int seq = scan.nextInt();if  { // 条件式子1为真时,进入第一个if分支处理System.out.println("凉风有信的谜底是“讽”");} else if  { // 否则的话,继续判断条件式子2为真时,进入第二个if分支处理System.out.println("秋月无边的谜底是“二”");} else { // 否则(前面的判断条件都不满足),进入else分支处理System.out.println;}

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

    if (str instanceof String) {
        ...
    }
// switch允许判断某个变量的多个取值,并分别进行单独处理switch  {case 1: // seq值为1时进入该分支System.out.println("凉风有信的谜底是“讽”");break; // 跳出多路分支。即跳到switch分支的右花括号之后case 2: // seq值为2时进入该分支System.out.println("秋月无边的谜底是“二”");break; // 跳出多路分支。即跳到switch分支的右花括号之后default: // seq值为其它时进入该分支System.out.println;break; // 跳出多路分支。即跳到switch分支的右花括号之后}System.out.println;

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

以往Java在使用switch/case时有个限制,就是case后面只能跟常量,不能跟变量,否则编译不通过。现在Kotlin去掉了这个限制,进行分支处理时允许引入变量判断,当然引入具体的运算表达式也是可以的。引入变量判断的演示代码如下:

多路分支固然好用,但要特别注意以下几点:
1、每个case分支末尾务必要加上break语句,否则即使该分支走完了也不会跳出多路分支,而是继续执行该分支的后面一个分支代码,显然这并非程序员的本意。
2、多路分支只能判断整型、字符串、枚举这三种类型的变量,无法判断布尔、浮点、双精度等其它类型的变量。
3、case语句后面的数值,只能用来进行相等判断,不能开展大于、小于等其它关系运算。

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

 

可要是分支数量多了起来,岂不是得写一样多的“if else”?这种做法虽然可行,但毕竟大费周折,条理也不够清晰。故而早期的设计师构造了“swicth-case”语句,也被称作是多路分支结构,在该控制流程之中,对每个分支都指定了一个数值把关,只有设定的变量符合数值要求,才能进到相应的分支处理。这样做的好处是,方便编译器在底层进行优化,既可利用二分查找法加快寻找速度,又可采取地址映射直接找到指定分支。兼容并蓄的Java自然继承了有利于调优的“swicth-case”,多路分支语句除了swicth和case,还额外增加了break和default两个关键字。break的作用是跳出整个多路分支,不再执行本分支及其余分支的代码;default的作用相当于else,所有不满足任何已知条件的数值,都进入到default这个默认分支来处理。
仍以猜谜游戏为例,使用“swicth-case”改写后的多路分支代码如下所示:

if  {seq = 1;} else {seq = 2;}

从以上代码可以看出when/else与switch/case有以下几点区别:
澳门三合彩票,1、关键字switch被when取代:
2、判断语句“case 常量值:”被“常量值 ->”取代;
3、每个分支后面的break语句取消了,Kotlin默认一个分支处理完就直接跳出多路语句;
4、关键字default被else取代;
跟优化后的if/else一样,Kotlin中的when/else也允许有返回值,所以上面多路分支代码可优化为如下代码:

前面提到条件语句的标准格式为“if { /* 条件成立时的操作代码 */ } else { /* 条件不成立时的操作代码 */ }”,乍看之下仿佛只有两个分支,一个是条件成立时的分支,另一个是条件不成立时的分支。很明显仅仅两个分支是不能满足复杂的业务需求的,自然Java代码也不会这么傻瓜到固步自封,为此else分支还允许嫁接别的if条件,形如“if { } else if { } else if { } else { }”这样,不管来几个条件分支,都能通过“else if”加以判断和处理。像之前的猜谜游戏,输入数字1时打印凉风有信的谜底,输入数字2时打印秋月无边的谜底,现在规定输入其它数字要打印“按键有误”的提示,此时一共存在三个条件分支,往原来的if/else语句添加一个“else if”即可实现三个分支。
下面便是改写成三个分支之后的代码例子:

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

总结一下,对于条件分支的处理,Kotlin实现了简单分支和多路分支,其中简单分支跟Java一样都是if/else,多路分支则由Java的switch/case升级为when/else。同时,Kotlin的条件分支允许有返回值,可算是一大改进。另外,Java的三元运算符“变量名=条件语句?取值A:取值B”,在Kotlin中取消了,对应功能改为使用if/else实现;Java的关键字instanceof也取消了,对应的类型判断功能被纳入到when/else机制中。

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

  

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

精简了的代码会不会似曾相识?仿佛脱胎于C语言跟Java的三元运算符“变量名=条件语句?取值A:取值B”。可是Kotlin并不提供这个三元运算符,因为使用上述的if/else语句已经实现了同样的功能,所以多余的三元运算符就被取消了。

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

    btn_if_value.setOnClickListener {
        tv_answer.text = if (is_odd==true) "凉风有信的谜底是“讽”" else "秋月无边的谜底是“二”"
        is_odd = !is_odd
    }

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

以上的优化代码可以进一步改进,因为每个分支内部只有一个字符串返回值,所以不妨去掉大括号,并且把整个条件语句精简到一行代码,就像下面这样:

 

本文由澳门三合彩票发布于编程,转载请注明出处:条件不成马上的操作代码,Kotlin对调整语句的管

关键词: