Kotlin学习之路(3)控制语句

2021-04-07 15:08:37 浏览数 (1)

任何编程语言都会有自己的条件控制语句,这样才能使其逻辑更加的完整。Kotlin的控制语句与Java类似但也有些不同,本节将对条件 循环 以及运算符号表达式进行详细的介绍。

【运算符与表达式】

1)一些常用运算符

Java支持的运算符(算术运算符 赋值运算符拓展后的赋值运算符 逻辑运算符)在Kotlin中这些运算符也全部支持。

单目运算符对应的方法

运算符

对应方法

a

a.unaryPlus()

-a

a.unaryMinus()

!a

a.not()

代码语言:javascript复制
 //在使用过程中
 var a = 20
 // 使用运算符
 var b = -a
 // 调用方法
 var c = a.unaryMinus()

自加自减运算符

运算符

对应的方法

a

a.inc

a- –

a.dec

由于 –放在变量前后是有区别的,因此inc() dec() 这两个方法还不完全等同于a a– 当 – -放在变量前面,执行过程如下:

先对变量调用inc() dec(),并将返回值赋值给变量 自加自减表达式返回变量的新值

当 –放在变量后面时执行的过程如下

先用一个临时变量缓存变量的值。 对变量调用inc()、dec()方法返回值赋值给变量。 自加或自减表达式返回临时变量的值。

双目运算符

运算符

对应的方法

a b

a.plus(b)

a-b

a.minus(b)

a*b

a.times(b)

a/b

a.div(b)

a%b

a.rem(b)

a…b

a.rangeTo(b)

2)相等于等运算符

运算符

对应的方法

a==b

a?.equals(b)?:(b===null)

a!=b

!a?.equals(b)?:(b===null)

Kotlin中的 == 不再比较两个变量是否引用同一个对象,通俗易懂的方式说在Kotlin 中的 == 相当于Java中的equals()方法,只不过==是比较空指针安全的

Java中的 == != 在Kotlin中则由 === 与 !== 代替了。

【条件分支】

1)简单分支

提起判断语句肯定是大家耳熟能详的if…eles…语句了,在Kotlin中用法与Java语法中仍然是一样的。

代码语言:javascript复制
        var xy: Boolean = true
        btn.setOnClickListener {
            if (xy) {
                tv.text = "你好哈"
            } else {
                tv.text = "我很好"
            }
            xy = !xy
        }

Kotlin还可以将上面的代码进行简化 ↓

代码语言:javascript复制
        var xy: Boolean = true
        btn.setOnClickListener {
            tv.text = if (xy) "你好哈" else "我很好"
            xy = !xy
        }

这种写法感觉就像Java中的三元运算符(变量名 = 条件语句?取值A:取值B),但是Kotlin中不提供这个三元运算符,因为Kotlin的 if…eles 已经实现了这个功能。

2)多分支

一提起多分支大家就会想起Java中的switch/case 语句,在Kotlin中switch/case 的机制还是存在的,只不过换了新的关键字when/else

代码语言:javascript复制
        var count: Int = 0
        btn.setOnClickListener {
            when (count) {
                0 -> tv.text = "少壮不努力"
                1 -> tv.text = "老大徒伤悲"
                else -> tv.text = "少侠,加油!"
            }
        }

从以上代码来看,when/else 与switch/case 有几点区别

首先是关键字switch被when替代 判断语句由原来的case:常量值变为现在的常量值 -> 每个分支后面没有break,Kotlin语句默认处理完一个分支默认跳出 关键字default被else取代 需要注意的一点 以往switch/case 中有个限制,就是case后面只能跟常量,不能跟变量否则编译失败。但是在Kotlin中这个限制被去掉了,进行分支处理的时候允许引入变量进行判断。

代码语言:javascript复制
        var count: Int = 0
        var even: Int = 0
        var odd: Int = 1
        btn.setOnClickListener {
            when (count) {
                even -> tv.text = "少壮不努力"
                odd -> tv.text = "老大徒伤悲"
                else -> tv.text = "少侠,加油!"
            }
        }

写到这里感觉Kotlin的多分支判断就这点东西哦?那就大错特错了。以前Java语言中switch/case机制中每个case仅仅对一个常量值,如果8个常量值那就得并列写出8个case。现在的when/else机制不用那么麻烦,这8个常量用逗号隔开即可。如果是几个常量刚好是连续的数字,可以使用in开始值…结束值指定范围,!in用法与之相反,下面看一下代码。

代码语言:javascript复制
        var count: Int = 0
        btn.setOnClickListener {
            when (count) {
                1, 3, 5, 7 -> tv.text = "少壮不努力"
                in 11..19 -> tv.text = "老大徒伤悲"
                !in 4..7 -> tv.text = "测试测试"
                else -> tv.text = "少侠,加油!"
            }
            count = count.inc()
        }

3)类型判断

Kotlin设定了when/else语句不仅可以判断变量值也可以判断变量的类型,如同Java的关键字instanceof那样。

代码语言:javascript复制
	if(str instanceof String){
		...
	}

在Kotlin中instanceof 被关键字is取代,下面就是kotlin代码格式

代码语言:javascript复制
	if(str is String){
		...
	}

在多路分支的when/else语句也支持类型判断,只不过是采用“is 变量类型->”这种方式

代码语言:javascript复制
        var count: Int = 0
        var countType: Number
        btn.setOnClickListener {
            countType = when (count) {
                0 -> count.toLong()
                1 -> count.toDouble()
                else -> count.toFloat()
            }
            count = (count   1) % 3
            tv.text = when (countType) {
                is Long -> "少壮不努力"
                is Double -> "老大徒伤悲"
                else -> "少侠,加油!"
            }
        }

【循环的使用】

1)遍历循环

Kotlin处理循环语句的时候依旧采用了for和while关键字,只是在具体的用法上有所微调,首先先来看一下for循环,如果使用Java遍历某个队列,可以通过“for(item:list)”的形式进行操作。同样在Kotlin中也能使用类似的循环,区别就是把冒号“ :”换成了关键字“ in ”,具体语句形如“for(item in list)”

代码语言:javascript复制
        var poeArray: Array<String> = arrayOf("离离原上草", "一岁一枯荣", "野火烧不尽", "春风吹又生")
        var poem: String = ""
        for (item in poeArray) {
            poem = "$poem$item,n"
        }
        tv.text = poem

运行的结果

我们注意到这首诗怎么全是逗号?所以这里面有个句号的问题,当行数为奇数的时候为逗号 “,” 行数为偶数的时候为句号“ 。” 我们使用Java编码的话,要是涉及到下标的循环,基本采用 for(初始化赋值语句;满足循环条件;循环之后的增减) 可以搞定

代码语言:javascript复制
for(int i =0;i<array.length;i  ){
 //这里只需要判断i是奇数是偶数即可完成,上述的句号问题
}

但是在使用Kotlin的时候,Kotlin废除了for(初始;条件;增减) 这个规则,若想实现上述功能,取而代之的则是for(i in 数组变量.indices),其中indices表示的该数组变量的下标数组,每次循环都从下标数组中依次取出当前元素的下标。然后根据判断下标的数值,再分别在句尾加上逗号或者句号。

代码语言:javascript复制
        var poeArray: Array<String> = arrayOf("离离原上草", "一岁一枯荣", "野火烧不尽", "春风吹又生")
        var poem: String = ""
        for (item in poeArray.indices) {

            if (item % 2 == 0) {
                poem = "$poem${poeArray[item]},n"
            } else {
                poem = "$poem${poeArray[item]}。n"
            }

        }
        tv.text = poem

2)条件循环

经过了刚才的例子,我们发现Kotlin废除了for(初始;条件;增减) 这个规则,虽然用了Kotlin for(i in 数组变量.indices)解决了逗句号的问题,但是在日常开发中,往往存在非同一般的需求,比如

① 如何设定判断条件的起始值与结束值? ② 如果每次循环递增的不是1怎么办? ③ 循环方向不是递增而是递减又怎么办? ④ 与判断条件的变量有关的不只有一个怎么办? 对于以上问题,Kotlin也给出了几个解决办法,代价无非就多了几个关键字,until step downTo

代码语言:javascript复制
 // 左闭右开区间,合法值包括8,但是不包括20
 for(i in 8 until 20){ ...}
 // 每次默认递增1,这里改为每次递增3
 for(i in 23..89 step 3){...}
 // downTo代表递减
  for(i in 89 downTo3){...}

在我看来这些方法过于繁琐,在日常开发中因为业务是千变万化的,并非几种固定的模式,虽然Kotlin废除了for(初始;条件;增减) 这个规则,但是开发者可以使用while语句实现相关功能,在Kotlin中while的使用方法与Java中的使用方法一致。

代码语言:javascript复制
    var poeArray: Array<String> = arrayOf("离离原上草", "一岁一枯荣", "野火烧不尽", "春风吹又生")
        var poem: String = ""
        var i: Int = 0
        while (i < poeArray.size) {
            
            if (i % 2 == 0) {
                poem = "$poem${poeArray[i]},n"
            } else {
                poem = "$poem${poeArray[i]}。n"
            }
            i  
        }

既然while语句保留下来了,那么do/while语句也保留下来了,写法跟Java写法没什么变化。(我几乎不用do/while)

代码语言:javascript复制
  var poeArray: Array<String> = arrayOf("离离原上草", "一岁一枯荣", "野火烧不尽", "春风吹又生")
        var poem: String = ""
        var i: Int = 0
        do {
            if (i % 2 == 0) {
                poem = "$poem${poeArray[i]},n"
            } else {
                poem = "$poem${poeArray[i]}。n"
            }
            i  
        } while (i < poeArray.size)
        
        poem = "${poem}该诗一共有${i}句"

3)跳出多重循环

我们在使用Java的时候,跳出多重循环经常用到的两个关键字 continue 和break。 在循环中 continue 只是跳出本次循环;而break跳出当前循环。如果有两层循环的话,使用Java代码,只能先跳出内层循环,然后外层循环中判断这个标志位是否跳出。 现在使用Kotlin不需要那么麻烦,只需要给外层加上一个@标记,接着遇到这个标记直接跳出。

代码语言:javascript复制
        var poeArray: Array<String> = arrayOf("离离原上草", "一岁一枯荣", "野火烧不尽", "春风吹又生")
        var i: Int = 0
        var found = false
        // 给外层循环加上个别名outside的标记
        outside@ while (i < poeArray.size) {
            var j: Int = 0
            var item = poeArray[i]

            while (j < item.length) {
                if (item[j] == '一') {
                    found = true

                    break@outside
                }
                j  
            }

            //如果直接跳出2层循环,这个是不需要的了
            //            if (found){
            //                break
            //            }
            i  
            
        }

小结

通过这次学习应该要掌握的技能 (1) 学会一些常用的运算符 (2) 学会使用判断语句,掌握if else判断,以及when/else 多分支判断 (3) 学会使用Kotlin循环方式for(item in list) ,以及while循环的使用 (4) 了解do/while的使用

[希望这篇文章可以帮到你]

0 人点赞