Kotlin_2_条件控制

302 阅读1分钟

选择结构

if...else...

if(判断条件) {
    执行语句1
    ...
}else {
    执行语句2
    ...
}
fun largerIntNumber(num1:Int,num2:Int):Int {
    var value = 0
    if (num1>num2) {
        value = num1
    }else {
        value = num2
    }
    return value
}

简化,直接将if条件句赋值给value:

fun largerIntNumber(num1:Int,num2:Int):Int {
	val value = if (num1>num2 {num1} else {num2}
	return value
}

fun main() {
	println("The bigger number is ${largerIntNumber(3,4)}")
}

再次简化,去掉value,直接return出if:

fun largerIntNumber(num1:Int,num2:Int):Int {
	return if (num1>num2) {num1} else {num2}
}

fun main() {
	println("The bigger number is ${largerIntNumber(5,4)}")
}

终极简化,使用语法糖

fun largerIntNumber(num1:Int,num2:Int):Int = if(num1>num2) num1 else num2

fun main() {
	println("The bigger number is ${largerIntNumber(100,1000)}")
}

需要注意的是,跟python中的if..elif..else..有点像,kotlin也有多个条件判断的结构,只是语法形式上稍有改变:

if (...) {
    ...
}else if(...) {
    ...
}else if(...) {
    ...
}else{
    ...
}

常见的练习就是,判断青中老年人(So BORING):

// 0-7 child 8-18 junior 19-40 youth 41-60 middle 60- elderly

fun judgeAge(age:Int):String {
	if (age>60) {
		return "elderly"
	}else if (age>40) {
		return "middle"
	}else if (age>18) {
		return "youth"
	}else if (age>7) {
		return "junior"
	}else {
		return "child"
	}
}

fun main() {
	println(judgeAge(1000))
}

when

精确匹配

fun getScore(name:String) = when(name){
    "Tome" -> 86
    "Jim" -> 77
    "Jack" -> 95
    "Lilly" -> 100
    else -> 0
}

when语句允许传入一个任意类型的参数,然后可以在when的结构体中定义一系列条件,格式为:

匹配值 -> { 执行逻辑 }

执行逻辑只有一行代码时,{ }可以省略。

类型匹配

fun checkNumber(num:Number){
	when (num) {
		is Int -> println("Int.")
		is Double -> println("Double.")
		else -> println("Not Support.")
	}
}

fun main(){
	val num = 10L
	checkNumber(num)
}//Not Support.

执行if..else..的功能

如果when语句中不提供参数,所有的分支条件都是简单的布尔表达式,则当一个分支条件为真时可执行该分支后面的执行语句。

fun biggerNum(num1:Int,num2:Int) {
	when {
		num1>num2 -> println("$num1>$num2")
		num1<num2 -> println("$num1<$num2")
		else -> println("$num1=$num2")
	}
}

fun main() {
	biggerNum(39,56)
}

循环结构

while

while语句会反复地进行条件判断,只要条件成立,{}内的执行语句就会执行,直到条件不成立,while循环结束。

while(循环条件) {
    执行语句
    ...
}

A BORING example,控制台打印出1-5:

fun main() {
	var n = 1
	while(n<=5) {
		println(n)
		n++
	}
}

do..while

do…while循环语句将循环条件放在了循环体的后面。这也就意味着执行语句会无条件执行一次,然后再根据循环条件来决定是否继续执行。

do {
    执行语句
    ...
}while(循环条件)

假如我们将之前的例子中的条件更换为n<1,则如果以while循环的话,不会输出东西,但是以do...while循环的话,则会输出一个1

fun main() {
	var n = 1
	do {
		println(n)
		n ++
	}while(n<1)
}
// 1

for(最常用)

for (循环对象 in 循环条件) {
    执行语句
    ...
}
  • 0..10 为[0,10]
  • 0 until 10 为[0,10)
  • 0 until 10 step 2 中,step为递增
  • 10 downTo 0 为降序
fun main() {
	for (i in 0..100 step 2) {
		println(i)
	}
}

for循环中只有一条执行语句时,则可以去掉{},简写为:

for(i in 0..100 step 2) println(n)

forEach()forEachIndexed()

调用者.forEach() {
    println("it=$it")
}

调用者可以是数组或集合,it表示数组中的元素。

fun main() {
	var arr = intArrayOf(1,2,3)
	arr.forEach() {
		println(it.toString()+"\t")
	}
}
调用者.forEachIndexed() { 
    index,it ->println("角标=$index 元素=$it")
}

index表示数组角标或者是集合的索引,it表示数组角标或者是集合索引中对应的元素。

fun main() {
	var arr = intArrayOf(1,2,3)
	arr.forEachIndexed() {
		index,it -> println("$index:$it")
	}
}

跳转 continue break

break

在循环语句中可以使用break语句。当它出现在while循环语句中时,作用是跳出循环语句。

值得注意的是,当break语句出现在嵌套循环中的内层循环时,它只能跳出内层循环,如果想使用break语句跳出外层循环则需要对外层循环添加标记loop@,同时调整为break@loop

fun main() {
	loop@ for (i in 0..9) {
		for (j in 0..i) {
			if (i>4) {
				break@loop
			}
			print("*")
		}
		print("\n")
	}
}

效果为:

*
**
***
****
*****

如果没有标记loop@,则j层循环至*****时会停止,但是i层循环会一直存在,那么\n会一直输出至结束。

continue

continue语句用在循环语句中,它的作用是终止本次循环,执行下一次循环。

A BORING example,计算[0,100]中奇数的和:

fun main() {
	var sum = 0
	for (i in 0 until 101) {
		if (i % 2 == 0){
			continue
		}
		sum += i
	}
	print("sum=$sum")
}

比较简单的写法,不刻意使用continue

fun main() {
	var sum = 0
	for (i in 1 .. 100 step 2) sum+=i
	println("sum=$sum")
}