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)


相关推荐

  • 阿里面试题:ConcurrentHashMap为什么是线程安全的?

    阿里面试题:ConcurrentHashMap为什么是线程安全的?阿里面试题:ConcurrentHashMap为什么是线程安全的?ConcurrentHashMap,其实是线程安全的HashMap,所以阅读ConcurrentHashMap,建议先阅读一下两篇介绍HashMap的文章你真的懂大厂面试题:HashMap吗?jdk1.7HashMap中的致命错误:循环链表jdk1.7ConcurrentHashMapjdk1.7Concu…

  • Linux中进行模块操作的命令

    Linux中进行模块操作的命令

  • File类createNewFile与createTempFile的区别[通俗易懂]

    自:http://www.cnblogs.com/huangyibo/p/3667714.html最近,在看代码时看到了一个方法,File.createTempFile(),由此联想到File.createNewFile()方法,一时间不知道两者到底有什么区别,感觉都是创建新文件嘛,后来查看api文档介绍,并经过自己动手试验,终于有了一个较为清楚地认识。 1.File的crea…

  • java map转object_json对象转map集合

    java map转object_json对象转map集合第一种方法:fastJosnimportcom.alibaba.fastjson.JSON;importcom.alibaba.fastjson.JSONObject;Object转MapFindArchiveDtofindArchiveDto=newFindArchiveDto();findArchiveDto.setContractStatus(“降龙”);…

  • COM组件原理_Com组件

    COM组件原理_Com组件在COM中,接口就是一个象类,每个接口有一个接口ID(uuid)。一个COM组件通常是连续继承下来的类,比如IUNknow->IDispath->IXX->CXX。这就形成了一个COM组件,当然组件一般是一个钻石继承的样子,这里为了简化原理把他们当成一个串形继承下来。每个COM组件都有一个CLSID(uuid),这个CLSID是注册的时候写进注册表的。这样就可以通过查询注册表中的CLSID

  • 经典的20道AJAX面试题[通俗易懂]

    经典的20道AJAX面试题[通俗易懂]1、什么是AJAX,为什么要使用Ajax(请谈一下你对Ajax的认识)什么是ajax:AJAX是“AsynchronousJavaScriptandXML”的缩写。他是指一种创建交互式网页应用的网页开发技术。Ajax包含下列技术:基于web标准(standards-basedpresentation)XHTML+CSS的表示;使用DOM(DocumentObjectM…

发表回复

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

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