美文网首页Kotlin请开始你的表演
Kotlin请开始你的表演——03流程控制篇

Kotlin请开始你的表演——03流程控制篇

作者: 雷小歪 | 来源:发表于2017-11-16 15:51 被阅读3次

    流程控制

    1、if语句

    基本用法在这里就不讲了,讲讲与Java不同的地方。

    • if表达式(替代三目运算符)

      简单来说就是if语句可以有返回值了,例如:

      var a: Int = 10
      var b: Int = 11
      var max = if (a > b) a else b
      

      别忘了,if语句是支持代码块的,所以我们还可以在返回值之前进行某些操作,只要保证返回值在代码块最后一行代码即可:

      var max2 = if (a > b) {
          println("a比b大")
          a
      } else {
          println("b大于或等于a")
          b
      }   
      

      注:if作为表达式进行赋值时,必须搭配else语句块一起使用。

    2、when语句

    when语句的出现,纯粹是为了替代switch,并且提供更多的功能。我们依旧通过一个简单的例子来了解:

    //通过数字值打印A-D字母
    var num = 1
    when(num){
        0 -> println("A")
        1 -> println("B")
        2 -> println("C")
        else -> println("D")
    }
    
    //结果:打印B
    

    想必如果换成switch语句也是so easy.但是如果我们需要将对应的字母暂时先存储起来在之后使用,那么switch语句必定是需要在语句前定义一个变量,在case里为该变量赋值。而when就不必那么麻烦,因为它如if表达式一样也支持返回值和代码块:

    • when表达式

       var numStr = when (num) {
              0 -> {
                  println("A")
                  "A"
              }
              1 -> {
                  println("B")
                  "B"
              }
              2 -> {
                  println("C")
                  "C"
              }
              else -> {
                  println("D")
                  "D"
              }
          }
      println(numStr) //打印B
      

      注:跟if语句一样when表达式也需要else语句搭配使用,但除非编译器可以证明分支条件已经覆盖所有可能性,此时是可以省略else语句的,例如下面使用枚举的例子:

      /**
       * 枚举类,只有4个枚举对象
       * */
      enum class MyEnum(val num: Int) {
          A(0), B(1), C(2), D(3)
      }
      

      此时的when表达式,只要考虑到以上4个枚举对象,就可以不使用else语句:

      var mEnum: MyEnum = MyEnum.B
      var enumStr = when (mEnum) {
          MyEnum.A -> "A"
          MyEnum.B -> "B"
          MyEnum.C -> "C"
          MyEnum.D -> "D"
      }
      println(enumStr)
      

    3、for语句

    Kotlin的for循环语句与Java想比精简了不少,通过下面例子大家体会下:

    var arr = arrayOf(1,2,3,4,5)
    //直接获取item
    for (item in arr) {
        println(item)
    }
    
    //通过索引获取item
    for (index in arr.indices) {
        println(arr[index])
    }
    
    //即获取对象,又获取索引
    for ((index, item) in arr.withIndex()) {
        println("$index :: $item")
    }
    

    并且只要数据类型是支持迭代器的,那么都可以使用这种for语句进行遍历数据。

    4、while和do...while语句

    while与do...while语句与Java相同,就先一笔带过_

    var arr = arrayOf(1, 2, 3, 4, 5)
    
    var index = 0
    while (index < arr.size) {
        println(arr[index])
        index++
    }
    
    var index2 = 0
    do {
        println(arr[index2])
        index2++
    } while (index2 < arr.size)
    

    5、break\continue\return语句&标签跳转

    这3条语句的基本用法以及语义在Kotlin中与其它语言一样:

    break       :   结束最近的闭合循环
    continue    :   跳到最近的闭合循环的下次循环
    return      :   退出当前函数
    

    我们还是来聊聊不同点,Kotlin中支持标签跳转(有点类似C语言的goto语句,但必须配合以上三条语句一起使用)。我们模拟一个三维数组,该数组中有3个数字88,而每个维度里只有一个数字88,让我们把这3个数的索引找出来:

    //三维数组
    var arr = arrayOf(
            arrayOf(arrayOf(1, 2, 3), arrayOf(1, 88, 3), arrayOf(1, 2, 3)),
            arrayOf(arrayOf(1, 2, 3), arrayOf(1, 2, 3), arrayOf(1, 88, 3)),
            arrayOf(arrayOf(1, 88, 3), arrayOf(1, 2, 3), arrayOf(1, 2, 3))
    )
    
    next@ for ((i, item) in arr.withIndex()) {
        for ((j, item2) in item.withIndex()) {
            for ((k, item3) in item2.withIndex()) {
                if (item3 == 88) {
                    println("($i , $j , $k)")
                    continue@next
                }
            }
        }
    }
    
    打印:
    (0 , 1 , 1)
    (1 , 2 , 1)
    (2 , 0 , 1)
    

    我们通过穷举来暴力查询这3个数,每当查到其中一个,就通过continue语句跳转到标签next@所在位置,并进行下次循环(当然如果我们使用break就会直接退出标签next@所在位置的for循环)。

    return语句搭配标签的使用场景,多半是在嵌套函数和lambda表达式中使用,等到对应篇章时再细聊。

    到此,Kotlin中流程控制相关的知识点也总结完毕,如有遗漏或错误,欢迎指正。

    相关文章

      网友评论

        本文标题:Kotlin请开始你的表演——03流程控制篇

        本文链接:https://www.haomeiwen.com/subject/tjnlvxtx.html