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

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

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

今天的学习目录

在这里插入图片描述

【运算符与表达式】

(1)一些常用运算符

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

单目运算符对应的方法

运算符 对应方法
+a a.unaryPlus()
-a a.unaryMinus()
!a a.not()
 //在使用过程中
 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语法中仍然是一样的。

        var xy: Boolean = true
        btn.setOnClickListener {
            if (xy) {
                tv.text = "你好哈"
            } else {
                tv.text = "我很好"
            }
            xy = !xy
        }

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

        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

        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中这个限制被去掉了,进行分支处理的时候允许引入变量进行判断。

        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用法与之相反,下面看一下代码。

        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那样。

	if(str instanceof String){
		...
	}

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

	if(str is String){
		...
	}

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

        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)”

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

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

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

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

        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

 // 左闭右开区间,合法值包括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中的使用方法一致。

    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)

  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不需要那么麻烦,只需要给外层加上一个@标记,接着遇到这个标记直接跳出。

        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的使用

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/2835.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • git查看用户名和邮箱 -切换用户和邮箱[通俗易懂]

    git查看用户名和邮箱 -切换用户和邮箱[通俗易懂]git用户查看和切换

    2022年9月7日
  • php点击一次 刷新两次,easyui window refresh 刷新两次的解决方法(推荐)

    php点击一次 刷新两次,easyui window refresh 刷新两次的解决方法(推荐)easyuiwindowrefresh刷新两次的解决方法(推荐)这样写刷新两次$(“#windowid”).window(‘refresh’,’url01.php’);$(“#windowid”).window(‘open’);这样写刷新一次$(“#windowid”).window(‘open’);$(“#windowid”).window(‘refresh’,’url01.php’);以…

    2022年7月18日
  • 出口押汇贷款_出口贸易融资业务

    出口押汇贷款_出口贸易融资业务出口商贸易融资工具:出口单据质押贷款出口单据质押贷款:是指进口商与出口商约定以汇款结算方式签订贸易合同,出口商在将货物装运上船,报关之后,将全套正本海运提单质押银行申请贷款,等到进口商付款之后,再将全套正本海运提单寄给进口商。特色:(1)无须其他担保,货物无权质押给银行即可实现资金周转,加速资金流通,给出口商经营带来便利,同时可以规避汇率风险。(2)融资方式简单,方

    2022年9月21日
  • 深度自编码器原理_编码器原理

    深度自编码器原理_编码器原理自编码器的目标:使用少量高阶特征重构输入定义:使用自身的高阶特征编码自己思想:自编码器其实也是一种神经网络,他的输入和输出一致的,借助稀疏编码的思想,目标是使用高阶特征重新组合来重构自己。特点:期望输入和输出一致;希望使用高阶特征来重构自己,而不只是复制像素点。Hinton提出基于信念网络(deepbeliefNetwords,DBN,由多层RBM堆叠而成)可以使用无监督学习逐层训练的贪心算法…

    2022年10月1日
  • 正态qq图怎么判断分布_怎么判断是不是QQ小号

    正态qq图怎么判断分布_怎么判断是不是QQ小号一、正态QQ图的原理QQ图通过把测试样本数据的分位数与已知分布相比较,从而来检验数据的分布情况。[1]分位数:亦称分位点,是指将一个随机变量的概率分布范围分为几个等份的数值点。常用的有一个分位数叫,百分位数,它是指如果将一组数据从小到大排序,并计算相应的累计百分位,则某一百分位所对应数据的值就称为这一百分位的百分位数。QQ图是一种散点图,对应于正态分布的QQ图,就是由标准正态分布的分位

    2022年8月10日
  • linux 中了挖矿病毒

    linux 中了挖矿病毒文章目录中毒特征磁盘cpu跑满100%如何处理反复发作中毒特征磁盘cpu跑满100%如何处理电脑中了挖矿病毒ps-aux|grepkinsingroot194470.01.811917235084?Sl4月150:04/var/tmp/kinsingroot272470.00.0112728…

    2022年6月9日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号