Kotlin系列三(kotlin中的流程控制)

五.kotlin中的流程控制

条件语句

  • kotlin中有"if"条件语句和"when"语句两种
  • kotlin中没有"switch"条件语句
  • kotlin中的"if"语句和"when"语句还可以当作表达式使用,即用有返回值

"if"条件语句

  • 语法格式
//if单分支
if(条件表达式){
    代码块
}

//if else双分支
if(条件表达式){
    代码块一
}else{
    代码块二
}

//if elseif else多分支
if(条件表达式一){
    代码块一
}else if(条件表达式二){
    代码块二
}else{
    代码块三
}
  • 案例
val num = 3;
//1.if循环
//1.1if单分支,满足if条件表达式才会执行代码块里的代码
//变量num的值大于0
if(num > 0){
    println("变量num的值大于0");
}

//1.2if else双分支,满足if条件表达式才会执行代码块里的代码,不满足则执行else代码块里的代码
//变量num的值大于0
if(num > 0){
    println("变量num的值大于0");
}else{
    println("变量num的值不大于0");
}

//1.3if elseif if多分支,从次序判断if和elseif中的条件表达式,如果满足则执行代码块里的代码,且只会有一个代码块被执行,都不满足则执行else代码块里的代码
//变量num的值等于3
if (num > 3){
    println("变量num的值大于3");
}else if (num < 3){
    println("变量num的值小于0");
}else{
    println("变量num的值等于3");
}

运行结果

"if"表达式语句

  • "if"表达式返回值是满足条件分支的最后一行语句的执行结果,不需要使用"return"关键字
  • "if"单分支表达式可以实现其他编程语言中三元表达式的效果
        //2.if表达式
        //2.1单分支表达式
        var result = if(num>3){
            true
        } else{
            false
        };
        //简化写法
//        var result = if(num>3) true else false;
        //if单分支表达式的结果result = false
        println("if单分支表达式的结果result = $result");

        val result2 = if(num >3){
            "变量num的值大于3";
        }else if (num < 3){
            "变量num的值小于3";
        }else{
            "变量num的值等于3";
        }
        //if多分支表达式的结果result2 = 变量num的值等于3
        println("if多分支表达式的结果result2 = $result2");

运行结果

"when"条件语句

  • 与其他编程语言中的"switch"语句类似
  • 但"when"语句只有在条件表达式为true的情况下才会执行代码块里的内容
  • 且如果满足多个条件表达式,对应的代码块都会被执行
  • 只有所有条件都不满足时才会执行else代码块的语句
  • 注意最后的else代码块不能省略,可以省略大括号
  • 语法格式
when(变量){
    条件一 ->{
     	代码块一   
    }
    条件二 ->{
        代码块二
    }
    else -> {
        else代码块
    }
}
  • 案例
//3.when条件语句,注意最后的else代码块不能省略
val language = "Kotlin";
when(language){
    "Java" -> {
        println("我在学Java");
    }
    "Kotlin" -> {
        println("我在学Kotlin");
    }
    else -> {
        println("我在学其他语言");
    }
}
//简化写法,可以省略小括号和大括号
when(language){
    "Java" -> println("我在学Java");
    "Kotlin" -> println("我在学Kotlin");
    else -> println("我在学其他语言");
}

运行结果

"when"代码块

  • "when"代码块可以多组逻辑不一致的"if"条件聚合到一起
  • 语法格式,比正常的"when"语句缺少传递的参数
when{
    条件一 ->{
        代码一
    }
    条件二 ->{
        代码块二
    }
    else ->{
        else代码块
    }
}
  • 案例
//4.when代码块
val age = 18;
when{
    3+5==8 ->{
        println("3+5=8");
    }
    age >= 18 ->{
        println("我已经成年了");
    }
    else ->{
        println("我是else代码块的内容");
    }
}
//简写
when{
    3+5==8 ->println("3+5=8");
    age >= 18 -> println("我已经成年了");
    else -> println("我是else代码块的内容");
}

运行结果

"when"表达式

  • "when"表达式与"if"表达式类似,都是以满足条件的代码块的最后一行语句的执行结果作为返回值
//5.when表达式
val result3 = when(language){
    "Kotlin" -> "我会Kotlin语言";
    "Java" -> "我会Java语言"
    else -> "我会其他语言";
}
//when表达式的结果result3 = 我会Kotlin语言
println("when表达式的结果result3 = $result3");

运行结果

"when"语句的多种案例

  1. 参数是否与给定值相同
val language = "Kotlin";
when(language){
    "Java" -> println("我在学Java");
    "Kotlin" -> println("我在学Kotlin");
    else -> println("我在学其他语言");
}
  1. 参数是否在一组值中
val language = "Kotlin";
when(language){
    "Java","Kotlin" -> {
        println("我在学编程语言");
    }
    "语文","数学" ->{
        println("我在学文化课");
    }
    else->{
        println("我在其他课程");
    }
}
  1. 参数是否在指定区间
when(20){
    in 1..100 ->{
        println("20在1到100之间");
    }
    in 101..200 ->{
        println("20在101到200之间");
    }
    else ->{
        println("20不在1到200之间");
    }
}
  1. 参数是否不在指定区间
when(20){
    !in 1..100 ->{
        println("20不在1到100之间");
    }
    !in 101..200 ->{
        println("20不在101到200之间");
    }
    else ->{
        println("20在1到200之间");
    }
}
  1. 参数是否属于指定数据类型
var date = Date();
when(date){
    is Number ->{
        println("变量date属于Number类型");
    }
    is Date -> {
        println("变量date属于Date类型");
    }
    else ->{
        println("变量date属于其他数据类型类型");
    }
}
  1. 参数是否不属于指定数据类型
var date = Date();
when(date){
    !is Number ->{
        println("变量date属于不Number类型");
    }
    !is Date -> {
        println("变量date不属于Date类型");
    }
    else ->{
        println("变量date属于其他数据类型类型");
    }
}

运行结果

循环语句

  • kotlin中有"while"循环,,"do while"循环,"for"循环和"repeat"循环四种

"while"循环

  • 先判断条件是否成立,如果成立则执行代码块的内容,不成立的则退出循环
  • 语法格式
while(条件表达式){
	代码块
}
  • 案例:循环三次并打印
//1.while循环,先判断后执行
val max = 3;
var count = 0;
while(count < max){
    println("当前的count值为:${count++}");
}

运行结果

"do while"循环

  • 先执行一次,再进行条件判断
  • 语法格式
do{
    代码块
}while(条件)
  • 案例
//2.do-while循环,先执行一次,然后再进行判断
count = 0;
do{
    println("当前的count值为:${count++}");
}while (count < max)

运行结果

"for"循环

  • kotlin中的"for"循环类似Java中的"forEach"循环
  • kotlin中的"for"循环,只能变量区间对象(数组,集合等等),或是实现Iterable接口的类
  • 语法格式
for(变量标识 in 区间对象/实现Iterable接口的类){
    代码块
}
  • 案例:遍历数组和区间对象
//3.for循环,支持迭代器,数组,字符串
val arr = arrayOf(1,2,3,4,5);
//for循环遍历数组
for (v in arr) {
    println("当前的值为:${v}");
}
//for遍历区间对象
for( v in 0..10){
    println("for循环中的值为:${v}");
}

运行结果

"repaeat"循环

  • "repeat"循环用于执行固定次数的代码片段
  • "repeat"循环有一个隐式参数"it",表示当前循环的次数,从0开始计数
  • 语法格式
repeat(循环次数){
    代码块
}
  • 案例
//4.repeat循环,repeat循环有一个隐式参数"it",表示当前循环的次数
repeat(5){
    println("repeat循环,当前的次数为:${it}");
}

运行结果

"continue"关键字跳过一次循环

  • 注意有多层循环嵌套时,只能跳过当前层的循环
//5.continue跳过本次循环
for(i in 1..5){
    //遍历到3就跳过本次循环
    if(i==3){
        continue;
    }
    println("continue关键字的使用,当前的值为:${i}");
}

运行结果

"break"关键字退出循环

  • 注意有多层循环嵌套时,只能退出当前层的循环
//6.break跳出循环
for (i in 1..5){
    //遍历到3就退出循环
    if(i==3){
        break;
    }
    println("break关键字的使用,当前的值为:${i}");
}

运行结果

kotlin标签语法在循环中的使用

  • kotlin的标签语法有点类似C语言中的"goto"关键字
  • 标签名由标识符和"@"字符组成 ,"@"字符必须在标识符的最后
  • 定义标签的时候"@"字符在标识符最后,使用标签的使用"@"字符在标识符最前
  • 使用kotlin的标签语法可以实现跳过多层循环或退出多层循环
        //7.kotlin中的标签语法
        //标签,定义标签的时候"@"字符在标识符最后
        outer@
        for (i in 1..5){
            for (j in 1..5){
                if (j==3){
                    //跳转到指定标签处,使用标签的使用"@"字符在标识符最前
                    //即可以配合break使用,也可以配合continue使用
//                    break@outer;
                    continue@outer;
                }
                println("当前的i值为:${i},当前的j值为:${j}");
            }
        }

运行结果