Kotlin语法入门–条件控制和循环语句(2)
文章目录
- Kotlin语法入门--条件控制和循环语句(2)
- 二、条件控制和循环语句
- 1、if...else
- 2、when
- 2.1、常规用法
- 2.2、特殊用法--并列:
- 2.3、特殊用法--类型判断:
- 2.4、特殊用法--区间:
- 2.5、返回值
- 3、循环
- 3.1、for..in
- 3.2、forEach
- 3.3、迭代器
- 3.4、【扩展】for..in中的withIndex方法
- 3.5、【扩展】forEachIndexed()方法
- 3.6、do...while和while
- 4、return,break,continue结束语句的使用
- 4.1、结束循环分支
- 4.2、标签备注代码块--@
- 4.3、forEach退出循环的几种方式
二、条件控制和循环语句
1、if…else
常规分支:
fun main() {var a = 1if (a == 1) {println("a is 1")} else {println("a is not 1")}
}
kotlin新特性:if语句可以有返回值
fun main() {var a = 1val b = if (a == 1) {3} else {4}println(b)
}
像上述这种,假如条件成立,则赋值给a,返回值不用return 即可返回。
但是,注意的是假如要有返回值,则必须要写else分支。
多分支已是如此:
fun main() {var a = 1val b = if (a == 1) {3} else if(a==3) {4}else{5}println(b)
}
由于kotlin没有三元表达式,所以,可以使用if及其分支拟造一个三元表达式:
fun main() {var a = 1var b = 2val c = if (a == b) true else falseprintln(c) }
2、when
2.1、常规用法
关于when的用法,可以对标Java中的Switch,示例代码如下:
fun main() {var a = 1when (a) {1 -> println("a is 1")2 -> println("a is 2")else -> println("a is null")}}
其中,else是默认输出语句,对标Java中的default
2.2、特殊用法–并列:
fun main() {var a = 1when (a) {1,3 -> println("a is 1") //1或32 -> println("a is 2")else -> println("a is null")}
}
2.3、特殊用法–类型判断:
fun main() {var a: Any = 1when (a) {is Int -> println("a is Int")is String -> println("a is String")else -> println("a is else")}
}
2.4、特殊用法–区间:
fun main() {var a: Any = 1when (a) {in 1..10 -> println("a is in range")is String -> println("a is a String")else -> println("none of the above")}
}
值得注意的是,每当判断到成立条件的时候,下面的条件不管成立否都不会执行。
还有,多个条件可以并列写,例如:
fun main() {var a: Any = 11when (a) {in 1..10,is Int -> println("a is in range or is Int")else -> println("none of the above")} }
2.5、返回值
与if一样,kotlin的when也可以带上返回值,将返回值写在执行的最后一样即可:
fun main() {var a: Any = 11val b = when (a) {in 1..10 -> {println("a is in range")1}is Int -> {println("a is a Int")2}else -> {println("none of the above")3}}println(b)
}
3、循环
3.1、for…in
fun main() {var list = (1..<20).toList()for (i in list) {println(i)}
}
3.2、forEach
下述的forEach其实就是对原有的方法进行扩展,
fun main() {var list = (1..<20).toList()list.forEach {println(it)}
}
其循环默认名字是it,也可以用自定义的名字,例如下面value->:
fun main() {var list = ('a'..<'z').toList()list.forEach {value->println(value)}
}
其实其底层也就是一个lamda表达式进行赋值,然后进行for循环:
3.3、迭代器
先看迭代器的方法:
next():获取下一个元素的值,就像有一个指针,指向下一个值,并获取。
hasnext():判断是否存在下一个值,并且返回boolean值。
fun main() {var list = (1..<20).toList()var iterator = list.listIterator()while (iterator.hasNext()) {println(iterator.next())}
}
3.4、【扩展】for…in中的withIndex方法
从上图可以看到,withIndex()方法要返回一个迭代器,其会返回一个对象,有下标index,和值i,可以通过kotlin的一个解构的方法获取:
fun main() {var list = ('a'..<'z').toList()for ((index,i)in list.withIndex()) {println("$index $i")}
}
输出:
3.5、【扩展】forEachIndexed()方法
fun main() {var list = ('a'..<'z').toList()list.forEachIndexed{index, value->println("$index $value")}
}
forEachIndexed()方法:
3.6、do…while和while
这两个语法没有变化,与常见语言的格式一样。
do…while:
fun main() {var i = 1do {println("$i")} while (i++ < 6)
}a
while:
fun main() {var i = 1while (i++ < 6) {println("$i")}
}
4、return,break,continue结束语句的使用
4.1、结束循环分支
例如:
fun main() {for (i in 1..10)for (j in 1..10) {if (i == 5 && j == 5) {break //或者continue}println("$i $j ")}
}
解释:首先,break或者continue会优先执行的语句段是距离关键字(break或者continue)最近的循环关键字,所以上述代码中break的是j所在的for。
4.2、标签备注代码块–@
fun main() {a@for (i in 1..10)for (j in 1..10) {if (i == 5 && j == 5) {break@a //或者continue}println("$i $j ")}
}
像这段,就可以指定a@…@a这段代码区域执行break或者continue。
4.3、forEach退出循环的几种方式
fun main() {(1..<10).forEach {if (it == 5) {// 执行跳出循环 }println(it)}
}
就像上述代码,想在it == 5的时候执行跳出循环 ,但是这个时候无法直接跳出循环,因为其底层是使用lamda表达式和函数实现的,即无法使用关键字break,continue。而使用return语句则会直接返回main函数,所以有下面几种写法:
-
寻找最近forEach,这样就不会打印5这个数字,就像continue一样。
fun main() {(1..<10).forEach {if (it == 5) {return@forEach // 执行跳过本次循环}println(it)} }
-
a@…@a方式与return@forEach一样,跳过本次循环。
fun main() {(1..<10).forEach a@{if (it == 5) {return@a // 执行跳过本次循环}println(it)} }
-
run函数结束循环,类似于return函数那种感觉。
fun main() {run {(1..<10).forEach{if (it == 5) {return@run// 执行结束循环(run函数内的结束)}println(it)}} }
-
同理上述方法可以写成
fun main() {run a@ {(1..<10).forEach{if (it == 5) {return@a // 执行结束循环}println(it)}} }