上一篇文章介绍了字符串的相关操作,其中示例代码用到了if和for语句,表面上看,Kotlin对控制语句的处理与Java很像,可实际上,Kotlin在这方面做了不少的改进,所以本篇和下一篇文章就分别介绍Kotlin如何操作条件判断和循环语句。

说起条件判断,最简单的莫过于人尽皆知的if...else...了,这个东东从C语言延续到Java,再进化到Kotlin,基本用法仍是一样的,看看下面的示例代码就知道了:

    var is_odd:Boolean = true;
tv_puzzle.text = "凉风有信,秋月无边。打二字"
btn_if_simple.setOnClickListener {
if (is_odd == true) {
tv_answer.text = "凉风有信的谜底是“讽”"
} else {
tv_answer.text = "秋月无边的谜底是“二”"
}
is_odd = !is_odd
}

以上代码的作用是,奇数次点击按钮,界面展示凉风有信的谜底;偶数次点击按钮,界面展示秋月无边的谜底。看似不能再简单的判断语句,谁能料到Kotlin也要加以简化?注意到两个谜底都是显示在控件tv_answer上,所以两个分支都出现了“tv_answer.text =”的语句。Kotin在这里要做的优化,便是允许分支语句返回字符串,从而在条件语句外层直接对tv_answer赋值,优化后的代码如下所示:

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

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

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

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

三元运算符既已被取消,一旁的switch/case瑟瑟发抖,嘴里嘟囔道:“俺这个多路分支还在不在呀?”看官莫急,虽然Kotlin对if/else进行了增强,但是仍无法取代switch/case;相反的是,Kotlin对多路分支的功能做了大幅扩充,当然由于原来的switch/case机制存在局限,故而Kotlin推出了新的关键字,即when/else来处理多路分支的条件判断。
下面来个多路分支里的when/else语句的具体代码:

    var count:Int = 0
btn_when_simple.setOnClickListener {
when (count) {
0 -> tv_answer.text = "凉风有信的谜底是“讽”"
1 -> tv_answer.text = "秋月无边的谜底是“二”"
//if语句可以没有else,但是when语句必须带上else
else -> tv_answer.text = "好诗,这真是一首好诗"
}
count = (count+1) % 3
}

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

    btn_when_value.setOnClickListener {
tv_answer.text = when (count) {
0 -> "凉风有信的谜底是“讽”"
1 -> "秋月无边的谜底是“二”"
else -> "好诗,这真是一首好诗"
}
count = (count+1) % 3
}

  

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

    var odd:Int = 0
var even:Int = 1
btn_when_variable.setOnClickListener {
tv_answer.text = when (count) {
odd -> "凉风有信的谜底是“讽”"
even -> "秋月无边的谜底是“二”"
else -> "好诗,这真是一首好诗"
}
count = (count+1) % 3
}

引入变量判断只是Kotlin牛刀小试,真正的功能扩充还在后面。原来的switch/case机制,每个case仅仅对应一个常量值,如果五个常量值都要进入某个分支的话,只能并列写五个canse语句,然后才跟上具体的分支处理语句。在when/else机制中便无需如此麻烦了,这五个常量值并排在一起用逗号隔开即可;如果几个常量值刚好是连续数字,可以使用“in 开始值..结束值”指定区间范围;举一反三,如果要求不在某个区间范围,则使用语句“!in 开始值..结束值”。扩展功能后的代码举例如下:

    btn_when_region.setOnClickListener {
tv_answer.text = when (count) {
1,3,5,7,9 -> "凉风有信的谜底是“讽”"
in 13..19 -> "秋月无边的谜底是“二”"
!in 6..10 -> "当里的当,客官你来猜猜"
else -> "好诗,这真是一首好诗"
}
count = (count+1) % 20
}

多路分支的故事还没完,Kotlin设定了when/else语句不仅仅判断变量值,也可以判断变量的类型,如同Java的关键字instanceof那样。比如Java代码若想知晓某个变量是否为字符串类型,则使用以下代码进行判断:

    if (str instanceof String) {
...
}

那么在Kotlin中,类型判断一样沿用when/else语句,只不过在分支判断时采取“is 变量类型 ->”这种形式。下面是演示类型判断的代码,在变量countType为Long、Double、Float三种类型时做多路处理:

    var countType:Number;
btn_when_instance.setOnClickListener {
count = (count+1) % 3
countType = when (count) {
0 -> count.toLong();
1 -> count.toDouble()
else -> count.toFloat()
}
tv_answer.text = when (countType) {
is Long -> "此恨绵绵无绝期"
is Double -> "树上的鸟儿成双对"
else -> "门泊东吴万里船"
}
}

  

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

__________________________________________________________________________
本文现已同步发布到微信公众号“老欧说安卓”,打开微信扫一扫下面的二维码,或者直接搜索公众号“老欧说安卓”添加关注,更快更方便地阅读技术干货。

Kotlin入门(6)条件分支的实现的更多相关文章

  1. Kotlin入门教程——目录索引

    Kotlin是谷歌官方认可的Android开发语言,Android Studio从3.0版本开始就内置了Kotlin,所以未来在App开发中Kotlin取代Java是大势所趋,就像当初Android ...

  2. Kotlin入门(14)继承的那些事儿

    上一篇文章介绍了类对成员的声明方式与使用过程,从而初步了解了类的成员及其运用.不过早在<Kotlin入门(12)类的概貌与构造>中,提到MainActivity继承自AppCompatAc ...

  3. Kotlin入门(15)独门秘笈之特殊类

    上一篇文章介绍了Kotlin的几种开放性修饰符,以及如何从基类派生出子类,其中提到了被abstract修饰的抽象类.除了与Java共有的抽象类,Kotlin还新增了好几种特殊类,这些特殊类分别适应不同 ...

  4. Kotlin入门第二课:集合操作

    测试项目Github地址: KotlinForJava 前文传送: Kotlin入门第一课:从对比Java开始 初次尝试用Kotlin实现Android项目 1. 介绍 作为Kotlin入门的第二课, ...

  5. Kotlin入门(7)循环语句的操作

    上一篇文章介绍了简单分支与多路分支的实现,控制语句除了这两种条件分支之外,还有对循环处理的控制,那么本文接下来继续阐述Kotlin如何对循环语句进行操作. Koltin处理循环语句依旧采纳了for和w ...

  6. Kotlin入门(11)江湖绝技之特殊函数

    上一篇文章介绍了Kotlin对函数的输入参数所做的增强之处,其实函数这块Kotlin还有好些重大改进,集中体现在几类特殊函数,比如泛型函数.内联函数.扩展函数.尾递归函数.高阶函数等等,因此本篇文章就 ...

  7. Python 工匠:编写条件分支代码的技巧

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由鹅厂优文发表于云+社区专栏 作者:朱雷 | 腾讯IEG高级工程师 『Python 工匠』是什么? 我一直觉得编程某种意义是一门『手艺』 ...

  8. Python教程(2.7)——条件分支

    像其它语言一样,Python也有条件分支. 例如,输入用户年龄,可能需要判断是否成年,并做出不同反应.这就需要用到条件分支. if条件分支 if条件分支的一般格式如下: if condition: s ...

  9. 从零开始学习PYTHON3讲义(七)条件分支和哥德巴赫猜想

    <从零开始PYTHON3>第七讲 人生是由无数个选择组成,每个选择都有不同的限定条件.现在来说人生有点早是吧:)不过事实的确是这样的. 程序也充满着选择,满足不同的条件,则运行不同的运算. ...

随机推荐

  1. Scala + IntelliJ IDEA

    学习路上的新起点:大数据Scala + Spark +(HDFS + HBase),本文主要介绍下Scala的基本语法和用法吧.最后再简单介绍一种Java开发工具IntelliJ IDEA的使用. S ...

  2. 关于如何使`(a === 1 && a === 2 && a === 3)`返回`true`问题的思考

    看见这个面试题目,第一反应就是在变量a取值时进行了一些改变,那就要用getter,关于存取器的介绍可以看这里 var temp = 1; Object.defineProperty(window, ' ...

  3. Virtualbox+Vagrant环境准备

    环境准备 所需软件 下载地址 VirtualBox-5.2.8-121009-Win https://download.virtualbox.org/virtualbox/5.2.12/Virtual ...

  4. MLlib之NaiveBayes算法源码学习

    package org.apache.spark.mllib.classification import breeze.linalg.{DenseMatrix => BDM, DenseVect ...

  5. Java并发框架AbstractQueuedSynchronizer(AQS)

    1.前言 本文介绍一下Java并发框架AQS,这是大神Doug Lea在JDK5的时候设计的一个抽象类,主要用于并发方面,功能强大.在新增的并发包中,很多工具类都能看到这个的影子,比如:CountDo ...

  6. Python3自动化运维之Fabric模版详解

    一.概要 Fabric是基于Python(2.7,3.4+以上版本)实现的SSH命令行工具,简化了SSH的应用程序部署及系统管理任务,它提供了系统基础的操作组件,可以实现本地或远程shell命令,包括 ...

  7. 高可用Hadoop平台-应用JAR部署

    1.概述 今天在观察集群时,发现NN节点的负载过高,虽然对NN节点的资源进行了调整,同时对NN节点上的应用程序进行重新打包调整,负载问题暂时得到缓解.但是,我想了想,这样也不是长久之计.通过这个问题, ...

  8. Java 范例 - 字节处理

    前言 Java 编程中常会遇到需要进行字节处理的地方,本篇文章就来探讨编程中会遇到的字节处理问题. 字节序 字节序(endianness)是对于多字节数据来说的,它描述了多字节数据存储的顺序,分为大端 ...

  9. Java 8 新特性-菜鸟教程 (5) -Java 8 Stream

    Java 8 Stream Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据. Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种 ...

  10. win10 关闭自动更新

    方法一 : 利用组策略关闭win10自动更新的步骤如下:1.按win+R打开“运行”,输入“gpedit.msc”,按下回车. 2.找到“计算机配置”→““管理模板”→“Windows 组件”→“Wi ...