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

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Contiki 2.7 Makefile 文件(三)

    Contiki 2.7 Makefile 文件(三)

  • 常用 SQL 语句大全[通俗易懂]

    常用 SQL 语句大全[通俗易懂]本文总结了开发工作中常用的SQL语句,供大家参考……–语句功能–数据操作SELECT–从数据库表中检索数据行和列INSERT–向数据库表添加新数据行DELETE–从数据库表中删除数据行UPDATE–更新数据库表中的数据–数据定义CREATETABLE–创建一个数据库表DROPTABLE–从数据库中删除表ALTERTABLE–修改数据库表结构CREA

  • java启动命令参数_centos配置java环境变量

    java启动命令参数_centos配置java环境变量问题说明为了分析和定位一个Java线上系统问题,我们需要查看JVM启动时的一些参数设置,例如:垃圾回收算法、堆大小等等。这些参数可能在启动脚本中明确指明,也可能采用默认值。在系统运行过程中其他人也许动态调整了系统参数。问题解决通过jps命令找对对应的进程号[root@swk-207~]#jps-lm|grepxk17743/xxx/server/skynet/lib/skynet-cl…

  • Linux防火墙管理

    Linux防火墙管理Linux防火墙管理防火墙类似于一个安全卫士管家,它能对你访问别人电脑,别人访问你的电脑,进行拦截并处理,有的阻止,有的放行,有的转发。​在默认情况下,Linux系统的防火墙状态是打开的,已经启动,CentOS7默认使用的是firewall作为防火墙。用户根据需求在/etc/sysconfig/firewalld配置文件中来配置防火墙,控制本机的“出、入”网络访问行为,其对行为的配置…

  • C语言中各种类型所占字节_C语言简单数据类型

    C语言中各种类型所占字节_C语言简单数据类型首先必须知道u8,s8等数据类型的定义:typedefsignedchars8;typedefunsignedcharu8;typedefsignedshorts16;typedefunsignedshortu16;typedefsignedints32;typedefunsignedintu32;typedef…

    2022年10月15日
  • pycharm虚拟环境下安装第三方库_pycharm虚拟环境下安装第三方库

    pycharm虚拟环境下安装第三方库_pycharm虚拟环境下安装第三方库文章目录前言一、什么是虚拟环境?二、PyCharm中创建虚拟环境1.virualenv2.pipenv3.conda4.导入环境三、包管理总结前言我们在用python进行开发时,往往不同的项目会使用不同的环境,那么如何让不同的环境并存呢?答案是使用虚拟环境。一、什么是虚拟环境?顾名思义,虚拟环境就是一个虚拟的、从电脑中独立开辟出的环境。有点类似于虚拟机,不同的虚拟机之间即可共存,又互不影响,python中使用的虚拟环境亦如此。比如我想要一个python3.9的环境,我就可以创建一个名为py39.

发表回复

您的电子邮箱地址不会被公开。

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