Kotlin初体验(四)- 控制语句

条件分支

条件分支是最简答的控制语句,主要包括两路分支和多路分支,我们一起探索下Kotlin给条件分支带来了哪些变化

简单条件分支

直接上代码:

        var i = 0
        textView.text = "开关"
		//类似Java写法
        btnClick.setOnClickListener {
            if (i % 2 == 0)
                textView.text = "关"
            else
                textView.text = "开"

            //每次自增
            i++
        }
        
        //上面写法与Java相同,Kotlin简洁到可以像三元运算符一样,直接赋值
        btnClick.setOnClickListener {
            textView.text = if (i % 2 == 0) "关" else "开"
            i++
        }

Kotlin两路分支,可以直接像三元运算符那样赋值操作,所以Kotlin不再支持三元运算符,即if/else已经取代了三。

多路分支

switch/case 是最常用的多路分支,可惜它case数据类型存在局限,所以Kotlin推出了新的关键字when/else
when/elseswtich/case 相比差别如下:

  • 关键字switch被when取代
  • 判断语句“case 常量值:”被新语句“常量值->”取代
  • 取消break,Kotlin默认一个分支处理完成后就直接跳出多路语句,所以不再需要break
  • 关键字default被else取代

when/else做了哪些升级:

  • Java中case后面只可以跟着常量,而kotlin也可以支持变量
  • Java中case后面只可以跟一个常量,遇到多种条件执行统一操作,只能多个case竖排不写break,最后一个时再写break,俗称:穿刺。而Kotlin中一个判断语句可以支持多个常量,当常量是连续值时可以使用in 开始值…结束值指定区域范围;若要求不在某个区域,则使用! in start…end
        var count = 0
        btnClick.setOnClickListener {
            when (count) {
                0 -> textView.text = "单曲循环"
                1 -> textView.text = "随机播放"
                2 -> textView.text = "顺序播放"
                else -> textView.text = "默认模式"
            }
            count = (count + 1) % 3
        }

        //或者更简洁的写法
        btnClick.setOnClickListener {
            textView.text = when (count) {
                0 -> "单曲循环"
                1 -> "随机播放"
                2 -> "顺序播放"
                else -> "默认模式"
            }
            count = (count + 1) % 3
        }

        //Java中只允许常量跟在case后面,Kotlin还允许变量
        var cond1: Int = 0
        var cond2: Int = 2
        var cond3: Int = 2

        btnClick.setOnClickListener {
            textView.text = when (count) {
                cond1 -> "单曲循环"
                cond2 -> "随机播放"
                cond3 -> "顺序播放"
                else -> "默认模式"
            }
            count = (count + 1) % 3
        }
        //注意:cond3与cond2重复了,cond3永远无法进入,提前被cond2拦截了


        var age = 1
        btnClick.setOnClickListener {
            textView.text =
                    when (age) {
                        1, 2, 3, 4, 5 -> "学前儿童"
                        in 6..12 -> "青少年"
                        in 13..22 -> "青年"
                        !in 60..99 -> "油腻中年"
                        else -> "世纪老人您好!"
                    }

            age += 3
        }

类型判断

when/else 不仅可以判断变量值,还可以判断变量类型,Java中常见instanceOf,在Kotlin中被is取代了。如if(str is String){ },在when/else中 用is 变量名 - >这种形式作为判断语句。

        var countType: Number
        var count = 0
        btnClick.setOnClickListener {
            count = (count + 1) % 3
            countType = when (count) {
                0 -> count.toLong()
                1 -> count.toFloat()
                else -> count.toDouble()
            }

            textView.text = when (countType) {
                is Long -> "Long类型"
                is Float -> "Float类型"
                is Double -> "Double类型"
                else -> "Number类型"
            }
        }

循环处理

遍历循环

Kotlin容器那一篇文章讲过三四种遍历,唯独没见for(初始 ; 条件 ; 增减),why?因为Kotlin取消了这种遍历模式,替换为for(i in list.indices){ },其中indice为下标数组,i为下标,依次取出。
Java中有for (String item : list),而在Kotlin中:被 in 替换变成了for (item in list)

条件循环

取消for(初始 ; 条件 ; 增减)是有代价的,好多场景是for(i in list.indices){ }无法处理的,例如,如何设定条件判断的起始值?每次循环步长增量不是1怎么办?循环方向递减呢?
针对以上情况,Kotlin给出了几种解决办法,例如增加关键字until,step,downTo等;

        //左闭右开 [6,14),表示包含6,但不包含14
        for (i in 6 until 14) {
            
        }
        //[11,50]但是步长为4,每次递增4,不是1
        for (i in 11..50 step 4) {

        }
        //从20到0递减循环
        for (i in 20 downTo 0) {

        }

但是尽管增加了关键字,但是并不完美。并且还增加了脱发风险,好在还有while,Kotlin的whiledo/while与Java完全一致。

跳出多重循环

Java中有多重循环时候,如果跳出,需要一层层加条件的去break。Kotlin支持一步到位跳出多层循环,“break@标记”

        var i = 2
        tag@ while (i > 1) {
            i++
            while (i > 5) {
                i += 3
                if (i >= 20) break@tag
            }
        }

猜你喜欢

转载自blog.csdn.net/iblade/article/details/82777119