系列文章全部为本人的学习笔记,若有任何不妥之处,随时欢迎拍砖指正。如果你觉得我的文章对你有用,欢迎关注我,我们一起学习进步!
Kotlin学习笔记(1)- 环境配置
Kotlin学习笔记(2)- 空安全
Kotlin学习笔记(3)- 语法
Kotlin学习笔记(4)- 流程控制
Kotlin学习笔记(5)- 类
Kotlin学习笔记(6)- 属性
Kotlin学习笔记(7)- 接口
Kotlin学习笔记(8)- 扩展
Kotlin学习笔记(8)- 扩展(续)
Kotlin学习笔记(9)- 数据类
Kotlin学习笔记(10)- 泛型
Kotlin学习笔记(11)- 内部类和嵌套类
Kotlin学习笔记(12)- 委托
Kotlin学习笔记(13)- 函数式编程
Kotlin学习笔记(14)- lambda
本文将的是Kotlin的流程控制语句,众所周知,流程控制是几乎所有变成的核心之一。Kotlin的流程控制在java的基础上做了优化,其中很大的一部分就是流程控制表达式可为变量直接赋值,这在java中,几乎只有三木运算一种实现方式。Kotlin的这一特点,大大提高了我们的效率。
本文中的一些内容和我上一篇的《Kotlin学习笔记(3)- 语法》有些重复,但是既然要讲流程,我觉得这些是一定要讲的,而且还会有一些拓展。
一、if 表达式
-
普通用法
var a = 3 var b = 5 var max : Int // 普通用法 if(a > b) max = a else max = b log("普通 max : $max") // 普通 max : 5
-
作为表达式,可以直接赋值给变量,其值为为true的分支的值
// 作为表达式 max = if(a>b) a else b log("表达式 max : $max") // 表达式 max : 5
-
分支的内容除了是简单的结果,也可以是代码块。值为true的分支的最后一行为结果
// 分支内容为代码块 max = if(a>b){ log("代码块 a>b") a }else{ log("代码块 a<=b") // 代码块 a<=b b } log("代码块 max : $max") // 代码块 max : 5
二、when 表达式
kotlin中的when
类似于java中switch
,用于多条件分支比对,和if
一样的,when
除了被用作语句这种普通用法外,也可作为表达式。还有一点和switch
不同的是,kotlin用else
代替了default
,感觉上把其他分支的优先级提前了,更加接近于多if...else if
,意思更加明确。
-
普通用法
var a = 3 var strA = "3" var out : String // 普通用法 when (a) { 1 -> log("普通 a :$a") 2 -> log("普通 a :$a") 3 -> log("普通 a :$a") // 普通 a :3 else -> log("普通 a :error") }
-
作为表达式,可以将结果赋值给变量,结果为符合条件的分支的值
out = when(a){ 1 -> "表达式 a :$a" 2 -> "表达式 a :$a" 3 -> "表达式 a :$a" else -> "表达式 a :error" } log(out) // 表达式 a :3
-
和
if
类似,分支的内容除了是简单的结果,也可以是代码块。值为符合条件的分支的最后一行为结果out = when(a){ 3 -> { log("代码块 a :$a") // 代码块 a :3 "代码块 a :$a" } else -> { log("代码块 a :error") "代码块 a :error" } } log(out) // 代码块 a :3
-
分支的条件也不仅限于常量,也可以是表达式
out = when(a){ parseInt(strA) -> "strA = a" else -> "表达式 parseInt :error" } log(out) // strA = a fun parseInt(str : String) = str.toInt()
-
如果多个分支的结果相同,或者有同样的操作,则可以将这些分支条件合并,之间用,分割
out = when(a){ 1,2,3 -> "表达式 a :$a" else -> "表达式 a :error" } log(out) // 表达式 a :3
-
in
表示范围区间out = when(a){ in 1..5 -> "$a is in 1..5" else -> "out of range" } log(out) // 3 is in 1..5
-
is
表示检查一个值out = when(a){ is Int -> "a is a Int" else -> "other type" } log(out) // a is a Int
-
when
可以不检验任何参数,所有的分支都是Boolean
,这时候如果一个分支的条件为true
时,则调用该分支when{ a is Int -> log("a is Int") // // a is Int else -> log("unknow type") }
-
如果有多个条件同时满足,则调用第一个满足条件的分支
out = when(a){ in 1..5 -> "$a is in 1..5" parseInt(strA) -> "strA = a" else -> "other case" } log(out) // 3 is in 1..5
三、循环
for
循环,可以对任何提供迭代器(iterator
)的集合进行遍历-
while
循环,使用方式和其他语言类似,有while
和do...while
两种具体使用方式可以看我上一篇文章《Kotlin学习笔记(3)- 语法》中的“九、循环”部分
四、返回和跳转
-
和java一样,kotlin中的返回和跳转有三种方式。
- return: 从最近的一个封闭的方法或者方法表达式跳出.
- break: 终止最近的封闭循环
- continue: 直接进入循环体的下次循环
-
除了上面三种常规的返回跳转方式外,kotlin还启用了一种特殊的用法:使用标识符
@
定义label,一般用在多层循环的内层向外层跳转。其中,break
和label
结合,表示跳出指定循环层。下面的break@label1
就表示跳出lebel1的指定的第一层循环,继续执行log(result)
var list = arrayOf(1, 2, 3) var child = arrayOf("a", "b", "c") var result = "" label1@ for(num in list){ // --> 第一层循环 result += "($num)" for(word in child){ // --> 第二层循环 if(word.equals("b")) break@label1 // --> break + label result += word } } log(result) // 输出 (1)a
而
continue
和label
结合,表示跳转到指定循环层,继续下一次循环。下面的continue@label2
表示跳到第一层循环,继续下一次循环。见输出结果可知,在word
为b
时,跳出了当前的第二层循环,跳到第一层继续循环label2@ for(num in list){ // --> 第一层循环 result += "($num)" for(word in child){ // --> 第二层循环 if(word.equals("b")) continue@label2 // --> continue + label result += word } } log(result) // 输出 (1)a(2)a(3)a
最后
本文肯定有很多地方没有写到,浅陋之处,请多包涵。
参考:https://github.com/kymjs/KotlinDoc-cn/blob/master/unit2/ReturnsJumps.md