Kotlin入门(6)条件分支的实现
上一篇文章介绍了字符串的相关操作,其中示例代码用到了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 = 0btn_when_simple.setOnClickListener {when (count) {0 -> tv_answer.text = "凉风有信的谜底是“讽”"1 -> tv_answer.text = "秋月无边的谜底是“二”"//if语句可以没有else,但是when语句必须带上elseelse -> 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 = 0var even:Int = 1btn_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) % 3countType = 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入门教程的完整目录
__________________________________________________________________________
本文现已同步发布到微信公众号“老欧说安卓”,打开微信扫一扫下面的二维码,或者直接搜索公众号“老欧说安卓”添加关注,更快更方便地阅读技术干货。
Kotlin入门(6)条件分支的实现相关推荐
- Kotlin入门教程——目录索引
Kotlin是谷歌官方认可的Android开发语言,即将发布的Android Studio 3.0版本也会开始内置Kotlin,所以未来在App开发中Kotlin取代Java是大势所趋,就像当初And ...
- 零基础入门学习 Python(4)条件分支、while循环、逻辑连接符、引入外援
Python的比较操作符 Python的比较操作符 含义 > 左边大于右边 >= 左边大于等于右边 < 左边小于右边 <= 左边小于等于右边 == 左边等于右边 != 左边不等 ...
- Kotlin入门(14)继承的那些事儿
上一篇文章介绍了类对成员的声明方式与使用过程,从而初步了解了类的成员及其运用.不过早在<Kotlin入门(12)类的概貌与构造>中,提到MainActivity继承自AppCompatAc ...
- Kotlin入门(15)独门秘笈之特殊类
上一篇文章介绍了Kotlin的几种开放性修饰符,以及如何从基类派生出子类,其中提到了被abstract修饰的抽象类.除了与Java共有的抽象类,Kotlin还新增了好几种特殊类,这些特殊类分别适应不同 ...
- Kotlin入门(7)循环语句的操作
上一篇文章介绍了简单分支与多路分支的实现,控制语句除了这两种条件分支之外,还有对循环处理的控制,那么本文接下来继续阐述Kotlin如何对循环语句进行操作. Koltin处理循环语句依旧采纳了for和w ...
- 【Kotlin入门教程】史上最全最易于理解最全面的文章
这里写自定义目录标题 前言 Kotlin学习笔记 1.val和var区别 2.简单变量之间的转换 3.数组变量的声明 4.字符串 字符串与基本类型的转换 字符串常用方法 字符串模板及其拼接 5.容器 ...
- JavaScript基础06-day08【if练习、条件分支语句switch、for循环】
学习地址: 谷粒学院--尚硅谷 哔哩哔哩网站--尚硅谷最新版JavaScript基础全套教程完整版(140集实战教学,JS从入门到精通) JavaScript基础.高级学习笔记汇总表[尚硅谷最新版Ja ...
- 1.4 编程基础之逻辑表达式与条件分支 16 三角形判断
http://noi.openjudge.cn/ch0104/16/ /* 1.4编程基础之逻辑表达式与条件分支 16 三角形判断 http://noi.openjudge.cn/ch0104/16/ ...
- Kotlin入门(26)数据库ManagedSQLiteOpenHelper
共享参数毕竟只能存储简单的键值对数据,如果需要存取更复杂的关系型数据,就要用到数据库SQLite了.尽管SQLite只是手机上的轻量级数据库,但它麻雀虽小.五脏俱全,与Oracle一样存在数据库的创建 ...
最新文章
- 【Red Hat 】vim编辑器的常用命令以及使用技巧
- Python脚本--微信公众号自定义菜单的创建及获取
- ajax链接php,关于php:在ajax切换后,单击链接没有任何作用?
- 【php7扩展开发五】函数调用
- python对印刷的用途_用Python式的方法来印刷价值
- 在Python中将列表转换为元组
- 面向对象-封装继承多态
- 放心吧,社区团购是兔子的尾巴长不了
- indiegogo众筹代理经验分享
- Windows Azure HDInsight 支持预览版 Hadoop 2.2 群集
- 刺猬文│以太坊交易信息解析方法
- 二分法中 mid=beg+(end-beg)/2 与 mid=(beg+end)/2 的区别?
- java 消除png 锯齿_反转(移除)抗锯齿滤波器
- 怎么把图片压缩到200K以内?如何在线压缩图片大小?
- oracle 11g 更改sid和dbname
- 笔记本安装固态涉及到的注意事项
- CVECWE概念及其关系
- 关于STM32H743的两串口调试纪录笔记
- CORS机制及其风险
- 关于可拓学-新兴的应用学科