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 = 1
if (a == 1) {
println("a is 1")
} else {
println("a is not 1")
}
}
kotlin新特性:if语句可以有返回值
fun main() {
var a = 1
val b = if (a == 1) {
3
} else {
4
}
println(b)
}
像上述这种,假如条件成立,则赋值给a,返回值不用return 即可返回。
但是,注意的是假如要有返回值,则必须要写else分支。
多分支已是如此:
fun main() {
var a = 1
val b = if (a == 1) {
3
} else if(a==3) {
4
}else{
5
}
println(b)
}
由于kotlin没有三元表达式,所以,可以使用if及其分支拟造一个三元表达式:
fun main() { var a = 1 var b = 2 val c = if (a == b) true else false println(c) }
2、when
2.1、常规用法
关于when的用法,可以对标Java中的Switch,示例代码如下:
fun main() {
var a = 1
when (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 = 1
when (a) {
1,3 -> println("a is 1") //1或3
2 -> println("a is 2")
else -> println("a is null")
}
}
2.3、特殊用法–类型判断:
fun main() {
var a: Any = 1
when (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 = 1
when (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 = 11 when (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 = 11
val 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 = 1
do {
println("$i")
} while (i++ < 6)
}a
while:
fun main() {
var i = 1
while (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) } } }