任何编程语言都会有自己的条件控制语句,这样才能使其逻辑更加的完整。Kotlin的控制语句与Java类似但也有些不同,本节将对条件 循环 以及运算符号表达式进行详细的介绍。
【运算符与表达式】
(1)一些常用运算符
Java支持的运算符(算术运算符 赋值运算符拓展后的赋值运算符 逻辑运算符)在Kotlin中这些运算符也全部支持。
单目运算符对应的方法
运算符 | 对应方法 |
---|---|
a | a.unaryPlus() |
-a | a.unaryMinus() |
!a | a.not() |
//在使用过程中
var a = 20
// 使用运算符
var b = -a
// 调用方法
var c = a.unaryMinus()
自加自减运算符
运算符 | 对应的方法 |
---|---|
a | a.inc |
a- – | a.dec |
由于 –放在变量前后是有区别的,因此inc() dec() 这两个方法还不完全等同于a a– 当 – -放在变量前面,执行过程如下:
先对变量调用inc() dec(),并将返回值赋值给变量 自加自减表达式返回变量的新值
当 –放在变量后面时执行的过程如下
先用一个临时变量缓存变量的值。 对变量调用inc()、dec()方法返回值赋值给变量。 自加或自减表达式返回临时变量的值。
双目运算符
运算符 | 对应的方法 |
---|---|
a b | a.plus(b) |
a-b | a.minus(b) |
a*b | a.times(b) |
a/b | a.div(b) |
a%b | a.rem(b) |
a…b | a.rangeTo(b) |
(2)相等于等运算符
运算符 | 对应的方法 |
---|---|
a==b | a?.equals(b)?:(b===null) |
a!=b | !a?.equals(b)?:(b===null) |
Kotlin中的 == 不再比较两个变量是否引用同一个对象,通俗易懂的方式说在Kotlin 中的 == 相当于Java中的equals()方法,只不过==是比较空指针安全的
Java中的 == != 在Kotlin中则由 === 与 !== 代替了。
【条件分支】
(1)简单分支
提起判断语句肯定是大家耳熟能详的if…eles…语句了,在Kotlin中用法与Java语法中仍然是一样的。
代码语言:javascript复制 var xy: Boolean = true
btn.setOnClickListener {
if (xy) {
tv.text = "你好哈"
} else {
tv.text = "我很好"
}
xy = !xy
}
Kotlin还可以将上面的代码进行简化 ↓
代码语言:javascript复制 var xy: Boolean = true
btn.setOnClickListener {
tv.text = if (xy) "你好哈" else "我很好"
xy = !xy
}
这种写法感觉就像Java中的三元运算符(变量名 = 条件语句?取值A:取值B),但是Kotlin中不提供这个三元运算符,因为Kotlin的 if…eles 已经实现了这个功能。
(2)多分支
一提起多分支大家就会想起Java中的switch/case 语句,在Kotlin中switch/case 的机制还是存在的,只不过换了新的关键字when/else
代码语言:javascript复制 var count: Int = 0
btn.setOnClickListener {
when (count) {
0 -> tv.text = "少壮不努力"
1 -> tv.text = "老大徒伤悲"
else -> tv.text = "少侠,加油!"
}
}
从以上代码来看,when/else 与switch/case 有几点区别
首先是关键字switch被when替代 判断语句由原来的case:常量值变为现在的常量值 -> 每个分支后面没有break,Kotlin语句默认处理完一个分支默认跳出 关键字default被else取代 需要注意的一点 以往switch/case 中有个限制,就是case后面只能跟常量,不能跟变量否则编译失败。但是在Kotlin中这个限制被去掉了,进行分支处理的时候允许引入变量进行判断。
代码语言:javascript复制 var count: Int = 0
var even: Int = 0
var odd: Int = 1
btn.setOnClickListener {
when (count) {
even -> tv.text = "少壮不努力"
odd -> tv.text = "老大徒伤悲"
else -> tv.text = "少侠,加油!"
}
}
写到这里感觉Kotlin的多分支判断就这点东西哦?那就大错特错了。以前Java语言中switch/case机制中每个case仅仅对一个常量值,如果8个常量值那就得并列写出8个case。现在的when/else机制不用那么麻烦,这8个常量用逗号隔开即可。如果是几个常量刚好是连续的数字,可以使用in开始值…结束值指定范围,!in用法与之相反,下面看一下代码。
代码语言:javascript复制 var count: Int = 0
btn.setOnClickListener {
when (count) {
1, 3, 5, 7 -> tv.text = "少壮不努力"
in 11..19 -> tv.text = "老大徒伤悲"
!in 4..7 -> tv.text = "测试测试"
else -> tv.text = "少侠,加油!"
}
count = count.inc()
}
(3)类型判断
Kotlin设定了when/else语句不仅可以判断变量值也可以判断变量的类型,如同Java的关键字instanceof那样。
代码语言:javascript复制 if(str instanceof String){
...
}
在Kotlin中instanceof 被关键字is取代,下面就是kotlin代码格式
代码语言:javascript复制 if(str is String){
...
}
在多路分支的when/else语句也支持类型判断,只不过是采用“is 变量类型->”这种方式
代码语言:javascript复制 var count: Int = 0
var countType: Number
btn.setOnClickListener {
countType = when (count) {
0 -> count.toLong()
1 -> count.toDouble()
else -> count.toFloat()
}
count = (count 1) % 3
tv.text = when (countType) {
is Long -> "少壮不努力"
is Double -> "老大徒伤悲"
else -> "少侠,加油!"
}
}
【循环的使用】
(1)遍历循环
Kotlin处理循环语句的时候依旧采用了for和while关键字,只是在具体的用法上有所微调,首先先来看一下for循环,如果使用Java遍历某个队列,可以通过“for(item:list)”的形式进行操作。同样在Kotlin中也能使用类似的循环,区别就是把冒号“ :”换成了关键字“ in ”,具体语句形如“for(item in list)”
代码语言:javascript复制 var poeArray: Array<String> = arrayOf("离离原上草", "一岁一枯荣", "野火烧不尽", "春风吹又生")
var poem: String = ""
for (item in poeArray) {
poem = "$poem$item,n"
}
tv.text = poem
运行的结果
我们注意到这首诗怎么全是逗号?所以这里面有个句号的问题,当行数为奇数的时候为逗号 “,” 行数为偶数的时候为句号“ 。” 我们使用Java编码的话,要是涉及到下标的循环,基本采用 for(初始化赋值语句;满足循环条件;循环之后的增减) 可以搞定
代码语言:javascript复制for(int i =0;i<array.length;i ){
//这里只需要判断i是奇数是偶数即可完成,上述的句号问题
}
但是在使用Kotlin的时候,Kotlin废除了for(初始;条件;增减) 这个规则,若想实现上述功能,取而代之的则是for(i in 数组变量.indices),其中indices表示的该数组变量的下标数组,每次循环都从下标数组中依次取出当前元素的下标。然后根据判断下标的数值,再分别在句尾加上逗号或者句号。
代码语言:javascript复制 var poeArray: Array<String> = arrayOf("离离原上草", "一岁一枯荣", "野火烧不尽", "春风吹又生")
var poem: String = ""
for (item in poeArray.indices) {
if (item % 2 == 0) {
poem = "$poem${poeArray[item]},n"
} else {
poem = "$poem${poeArray[item]}。n"
}
}
tv.text = poem
(2)条件循环
经过了刚才的例子,我们发现Kotlin废除了for(初始;条件;增减) 这个规则,虽然用了Kotlin for(i in 数组变量.indices)解决了逗句号的问题,但是在日常开发中,往往存在非同一般的需求,比如
① 如何设定判断条件的起始值与结束值? ② 如果每次循环递增的不是1怎么办? ③ 循环方向不是递增而是递减又怎么办? ④ 与判断条件的变量有关的不只有一个怎么办? 对于以上问题,Kotlin也给出了几个解决办法,代价无非就多了几个关键字,until step downTo
代码语言:javascript复制 // 左闭右开区间,合法值包括8,但是不包括20
for(i in 8 until 20){ ...}
// 每次默认递增1,这里改为每次递增3
for(i in 23..89 step 3){...}
// downTo代表递减
for(i in 89 downTo3){...}
在我看来这些方法过于繁琐,在日常开发中因为业务是千变万化的,并非几种固定的模式,虽然Kotlin废除了for(初始;条件;增减) 这个规则,但是开发者可以使用while语句实现相关功能,在Kotlin中while的使用方法与Java中的使用方法一致。
代码语言:javascript复制 var poeArray: Array<String> = arrayOf("离离原上草", "一岁一枯荣", "野火烧不尽", "春风吹又生")
var poem: String = ""
var i: Int = 0
while (i < poeArray.size) {
if (i % 2 == 0) {
poem = "$poem${poeArray[i]},n"
} else {
poem = "$poem${poeArray[i]}。n"
}
i
}
既然while语句保留下来了,那么do/while语句也保留下来了,写法跟Java写法没什么变化。(我几乎不用do/while)
代码语言:javascript复制 var poeArray: Array<String> = arrayOf("离离原上草", "一岁一枯荣", "野火烧不尽", "春风吹又生")
var poem: String = ""
var i: Int = 0
do {
if (i % 2 == 0) {
poem = "$poem${poeArray[i]},n"
} else {
poem = "$poem${poeArray[i]}。n"
}
i
} while (i < poeArray.size)
poem = "${poem}该诗一共有${i}句"
(3)跳出多重循环
我们在使用Java的时候,跳出多重循环经常用到的两个关键字 continue 和break。 在循环中 continue 只是跳出本次循环;而break跳出当前循环。如果有两层循环的话,使用Java代码,只能先跳出内层循环,然后外层循环中判断这个标志位是否跳出。 现在使用Kotlin不需要那么麻烦,只需要给外层加上一个@标记,接着遇到这个标记直接跳出。
代码语言:javascript复制 var poeArray: Array<String> = arrayOf("离离原上草", "一岁一枯荣", "野火烧不尽", "春风吹又生")
var i: Int = 0
var found = false
// 给外层循环加上个别名outside的标记
outside@ while (i < poeArray.size) {
var j: Int = 0
var item = poeArray[i]
while (j < item.length) {
if (item[j] == '一') {
found = true
break@outside
}
j
}
//如果直接跳出2层循环,这个是不需要的了
// if (found){
// break
// }
i
}
小结
通过这次学习应该要掌握的技能 (1) 学会一些常用的运算符 (2) 学会使用判断语句,掌握if else判断,以及when/else 多分支判断 (3) 学会使用Kotlin循环方式for(item in list) ,以及while循环的使用 (4) 了解do/while的使用
[希望这篇文章可以帮到你]