选择结构
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")
}