在前面 的章节中讲解了Kotlin语言中的数据类型、变量与常量的定义。不了解请参见前面的内容:

  1. Kotlin——初级篇(三):数据类型详解
  2. Kotlin——初级篇(二)常量、变量、注释

下面详细为大家讲解Kotlin中的控制语句使用。不得不说其和Java中还是有很多不一样的地方。

目录

一、if语句

Kotlin中的if语句和Java还是还是有一定的区别的,它能在Java中更灵活,除了能实现Java写法外,还可以实现表达式(实现三元运算符),及作为一个块的运用。

1、传统写法(同Java写法一样)

例:

  1. var numA = 2
  2. if (numA == 2){
  3. println("numA == $numA => true")
  4. }else{
  5. println("numA == $numA => false")
  6. }

输出结果为:

  1. numA == 2 => true

2、Kotlin中的三元运算符

  • 在Kotlin中其实是不存在三元运算符(condition ? then : else)这种操作的。
  • 那是因为if语句的特性(if表达式会返回一个值)故而不需要三元运算符。

例:

  1. // 在Java中可以这么写,但是Kotlin中直接会报错。
  2. // var numB: Int = (numA > 2) ? 3 : 5
  3. // kotlin中直接用if..else替代。例:
  4. var numB: Int = if ( numA > 2 ) 3 else 5 // 当numA大于2时输出numB的值为3,反之为5
  5. println("numB = > $numB")

输出结果为:

  1. numB = > 3

由上可以看出,Kotlin中的if可以作为一个表达式并返回一个值。

3、作为一个块结构,并且最后一句表达式为块的值

例:

  1. var numA: Int = 2
  2. var numC: Int = if (numA > 2){
  3. numA++
  4. numA = 10
  5. println("numA > 2 => true")
  6. numA
  7. }else if (numA == 2){
  8. numA++
  9. numA = 20
  10. println("numA == 2 => true")
  11. numA
  12. }else{
  13. numA++
  14. numA = 30
  15. println("numA < 2 => true")
  16. numA
  17. }
  18. // 根据上面的代码可以看出,每一个if分支里面都是一个代码块,并且返回了一个值。根据条件numC的值应该为20
  19. println("numC => $numC")

输出结果为:

  1. numA == 2 => true
  2. numC => 20

二、for语句

  • Kotlin废除了Java中的for(初始值;条件;增减步长)这个规则。但是Kotlin中对于for循环语句新增了其他的规则,来满足刚提到的规则。
  • for循环提供迭代器用来遍历任何东西
  • for循环数组被编译为一个基于索引的循环,它不会创建一个迭代器对象

1、新增的规则,去满足for(初始值;条件;增减步长)这个规则

  • 1.1、递增

关键字:until

范围:until[n,m) => 即大于等于n,小于m

例:

  1. // 循环5次,且步长为1的递增
  2. for (i in 0 until 5){
  3. print("i => $i \t")
  4. }

输出结果为

  1. i => 0 i => 1 i => 2 i => 3 i => 4
  • 1.2、递减
  • 关键字:downTo
  • 范围:downTo[n,m] => 即小于等于n,大于等于m ,n > m

例:

  1. // 循环5次,且步长为1的递减
  2. for (i in 15 downTo 11){
  3. print("i => $i \t")
  4. }

输出结果为:

  1. i => 15 i => 14 i => 13 i => 12 i => 11

1.3、符号(' .. ' ) 表示递增的循环的另外一种操作

  • 使用符号( '..').
  • 范围:..[n,m]=> 即大于等于n,小于等于m
  • until的区别,一是简便性。二是范围的不同。

例:

  1. print("使用 符号`..`的打印结果\n")
  2. for (i in 20 .. 25){
  3. print("i => $i \t")
  4. }
  5. println()
  6. print("使用until的打印结果\n")
  7. for (i in 20 until 25){
  8. print("i => $i \t")
  9. }

输出结果为:

  1. 使用 符号`..`的打印结果
  2. i => 20 i => 21 i => 22 i => 23 i => 24 i => 25
  3. 使用until的打印结果
  4. i => 20 i => 21 i => 22 i => 23 i => 24

1.4、设置步长

关键字:step

例:

  1. for (i in 10 until 16 step 2){
  2. print("i => $i \t")
  3. }

输出结果为:

  1. i => 10 i => 12 i => 14

2、迭代

  • for循环提供一个迭代器用来遍历任何东西。
  • for循环数组被编译为一个基于索引的循环,它不会创建一个迭代器对象

2.1、遍历字符串

此用法在数据类型章节中的字符串类型中用到过。还不甚清楚的可以查看Kotlin——初级篇(三):数据类型详解

例:

  1. for (i in "abcdefg"){
  2. print("i => $i \t")
  3. }

输出结果为:

  1. i => a i => b i => c i => d i => e i => f i => g

2.2、遍历数组

此用法在数据类型章节中的数组类型中用到过。还不甚清楚的可以查看Kotlin——初级篇(三):数据类型详解

例:

  1. var arrayListOne = arrayOf(10,20,30,40,50)
  2. for (i in arrayListOne){
  3. print("i => $i \t")
  4. }

输出结果为:

  1. i => 10 i => 20 i => 30 i => 40 i => 50

2.3、使用数组的indices属性遍历

例:

  1. var arrayListTwo = arrayOf(1,3,5,7,9)
  2. for (i in arrayListTwo.indices){
  3. println("arrayListTwo[$i] => " + arrayListTwo[i])
  4. }

输出结果为:

  1. arrayListTwo[0] => 1
  2. arrayListTwo[1] => 3
  3. arrayListTwo[2] => 5
  4. arrayListTwo[3] => 7
  5. arrayListTwo[4] => 9

2.4、使用数组的withIndex()方法遍历

例:

  1. var arrayListTwo = arrayOf(1,3,5,7,9)
  2. for ((index,value) in arrayListTwo.withIndex()){
  3. println("index => $index \t value => $value")
  4. }

输出结果为:

  1. index => 0 value => 1
  2. index => 1 value => 3
  3. index => 2 value => 5
  4. index => 3 value => 7
  5. index => 4 value => 9

2.5、使用列表或数组的扩展函数遍历

  • 数组或列表有一个成员或扩展函数iterator()实现了Iterator<T>接口,且该接口提供了next()hasNext()两个成员或扩展函数
  • 其一般和while循环一起使用
  1. 可以查看Array.kt这个类。可以看见其中的iterator()函数,而这个函数实现了Iterator接口。

    1. /**
    2. * Creates an iterator for iterating over the elements of the array.
    3. */
    4. public operator fun iterator(): Iterator<T>
  2. 查看Iterator.kt这个接口类,这个接口提供了hasNext()函数和next()函数。

    1. public interface Iterator<out T> {
    2. /**
    3. * Returns the next element in the iteration.
    4. */
    5. public operator fun next(): T
    6. /**
    7. * Returns `true` if the iteration has more elements.
    8. */
    9. public operator fun hasNext(): Boolean
    10. }

例:

  1. var arrayListThree = arrayOf(2,'a',3,false,9)
  2. var iterator: Iterator<Any> = arrayListThree.iterator()
  3. while (iterator.hasNext()){
  4. println(iterator.next())
  5. }

输出结果为:

  1. 2
  2. a
  3. 3
  4. false
  5. 9

终上所述就是for循环语句常用的用法。

三、when语句

  • Kotlin中已经废除掉了Java中的switch语句。而新增了when(exp){}语句。
  • when语句不仅可以替代掉switch语句,而且比switch语句更加强大

3.1、when语句实现switch语句功能

例:

  1. when(5){
  2. 1 -> {
  3. println("1")
  4. }
  5. 2 -> println("2")
  6. 3 -> println("3")
  7. 5 -> {
  8. println("5")
  9. }
  10. else -> {
  11. println("0")
  12. }
  13. }

输出结果为:

  1. 5

3.2、和逗号结合使用,相当于switch语句中的不使用break跳转语句

例:

  1. when(1){
  2. // 即x = 1,2,3时都输出1。
  3. 1 , 2 , 3 -> {
  4. println("1")
  5. }
  6. 5 -> {
  7. println("5")
  8. }
  9. else -> {
  10. println("0")
  11. }
  12. }

输出结果为:

  1. 1

3.3、条件可以使用任意表达式,不仅局限于常量

相当于if表达式的用法。

例:

  1. var num:Int = 5
  2. when(num > 5){
  3. true -> {
  4. println("num > 5")
  5. }
  6. false ->{
  7. println("num < 5")
  8. }
  9. else -> {
  10. println("num = 5")
  11. }
  12. }

输出结果为:

  1. num < 5

3.4、 检查值是否存在于集合或数组中

  • 操作符:

    1. (in)
    2. (!in) 不在
  • 限定:只适用于数值类型

例:

  1. var arrayList = arrayOf(1,2,3,4,5)
  2. when(1){
  3. in arrayList.toIntArray() -> {
  4. println("1 存在于 arrayList数组中")
  5. }
  6. in 0 .. 10 -> println("1 属于于 0~10 中")
  7. !in 5 .. 10 -> println("1 不属于 5~10 中")
  8. else -> {
  9. println("都错了 哈哈!")
  10. }
  11. }

输出结果为:

  1. 元素`1`存在于 arrayList数组中

其中,符号( .. )表示的意思。如例子中的0 .. 10就表示0至10或者0到10

3.5、检查值是否为指定类型的值

  • 操作符

    1. (is)
    2. 不是(!is)
  • 值得注意的是,Kotlin的智能转换可以访问类型的方法和属性

例:

  1. when("abc"){
  2. is String -> println("abc是一个字符串")
  3. else -> {
  4. println("abc不是一个字符串")
  5. }
  6. }
  7. // 智能转换
  8. var a: Int = 2
  9. when(a){
  10. !is Int -> {
  11. println("$a 不是一个Int类型的值")
  12. }
  13. else -> {
  14. a = a.shl(2)
  15. println("a => $a")
  16. }
  17. }

输出结果为:

  1. abc是一个字符串
  2. a => 8

3.6、不使用表达式的when语句

表示为最简单的布尔表达式

例:

  1. var array = arrayOfNulls<String>(3)
  2. when{
  3. true -> {
  4. for (i in array){
  5. print(" $i \t")
  6. }
  7. println()
  8. }
  9. else -> {
  10. }
  11. }

输出结果为:

  1. null null null

综上所述,为Kotlinwhen控制语句的常见用法。可以看出它的强大。以及便利性。不仅可以替代掉Java语句中的swicth语句。甚至可以替换掉if语句。

四、while语句

  • 其同Java中的while循环一样。在此不做累述。
  • 定义格式:
  1. while(exp){ 其中exp为表达式
  2. ...
  3. }

例:

  1. var num = 5
  2. var count = 1
  3. while (num < 10){
  4. println("num => $num")
  5. println("循环了$count 次")
  6. count++
  7. num++
  8. }

输出结果为:

  1. num => 5
  2. 循环了1
  3. num => 6
  4. 循环了2
  5. num => 7
  6. 循环了3
  7. num => 8
  8. 循环了4
  9. num => 9
  10. 循环了5

五、do...while语句

  • 其同Java中的do...while循环一样。在此不做累述。
  • 定义格式:
  1. do(exp){ // 其中exp为表达式
  2. ...
  3. }(while)

例:

  1. var num = 5
  2. var count = 1
  3. do {
  4. println("num => $num")
  5. println("循环了$count 次")
  6. count++
  7. num++
  8. }while (num < 10)

输出结果为:

  1. num => 5
  2. 循环了1
  3. num => 6
  4. 循环了2
  5. num => 7
  6. 循环了3
  7. num => 8
  8. 循环了4
  9. num => 9
  10. 循环了5

PS: do{...}while(exp)与while(exp){...}最大的区别是do{...}while(exp)最少执行一次,这点也是和Java相同的

例:

  1. var num = 5
  2. var count = 1
  3. do {
  4. println("num => $num")
  5. println("循环了$count 次")
  6. count++
  7. num++
  8. }while (num < 5)

输出结果为:

  1. num => 5
  2. 循环了1

六、跳转语句(returnbreakcontinue

其同Java中的跳转语句一样。在此不做累述。

1、return语句

默认情况下,从最近的封闭函数或匿名函数返回。

例:

  1. fun returnExample(){
  2. var str: String = ""
  3. if (str.isBlank()){
  4. println("我退出了该方法")
  5. return
  6. }
  7. }

输出结果为:

  1. 我退出了该方法

2、break语句

作用:终止最近的闭合循环。

例:

  1. var count: Int = 1
  2. for (i in 1 until 10){
  3. if (i == 5){
  4. println("我在第$i 次退出了循环")
  5. break
  6. }
  7. count++
  8. }
  9. println("我循环了多少次:count => $count")

输出结果为:

  1. 我在第5 次退出了循环
  2. 我循环了多少次:count => 5

3、continue语句

前进到最近的封闭循环的下一个步骤(迭代)。

例:

  1. for (i in 1 until 10){
  2. if (i == 5){
  3. println("我跳过了第$i 次循环")
  4. continue
  5. }
  6. println("i => $i")
  7. }

输出结果为:

  1. i => 1
  2. i => 2
  3. i => 3
  4. i => 4
  5. 我跳过了第5 次循环
  6. i => 6
  7. i => 7
  8. i => 8
  9. i => 9

七、总结

不管对于任何一门编程语言,都有最基本的条件逻辑控制语句,而其语句是学习一门编程语言的基础。所以请各位大佬认真并且跟着代码敲一遍。特别是for语句和when语句这两个点。因为这两个点都和Java语言很大的改动。当然,if语句中的三元运算符也是值得注意的

源代码

如果各位大佬看了之后感觉还阔以,就请各位大佬随便star一下,您的关注是我最大的动力。

我的个人博客Jetictors

我的掘金Jetictors

GithubJteictors

欢迎各位大佬进群共同研究、探索

QQ群号:497071402

Kotlin——最详细的控制语句使用的更多相关文章

  1. Kotlin——最详细的常量、变量、注释的使用

    在Kotlin中的变量.常量以及注释多多少少和Java语言是有着不同之处的.不管是变量.常量的定义方式,还是注释的使用.下面详细的介绍Kotlin中的变量.常量.注释的使用.以及和Java的对比. 如 ...

  2. Kotlin——最详细的接口使用、介绍

    在Kotlin中,接口(Interface)的使用和Java中的使用方式是有很大的区别.不管是接口中的属性定义,方法等.但是定义方式还是相同的. 目录 一.接口的声明 1.接口的声明 关键字:inte ...

  3. Kotlin——最详细的操作符与操作符重载详解(上)

    本篇文章为大家详细的介绍Koltin特有的操作符重载.或许对于有编程经验的朋友来说,操作符这个词绝对不陌生,就算没有任何编辑基础的朋友,数学中的算数运算符也绝不陌生.例如(+.-.*./.>.& ...

  4. Kotlin——最详细的数据类型介绍

    任意一种开发语言都有其数据类型,并且数据类型对于一门开发语言来说是最基本的构成,同时也是最基础的语法.当然,kotlin也不例外.kotlin的数据类型和Java是大致相同的,但是他们的写法不同,并且 ...

  5. Kotlin——最详细的数据类、密封类详解

    在前面几个章节章节中,详细的讲解了Koltin中的接口类(Interface).枚举类(Enmu),还不甚了解的可以查看我的上一篇文章Kotlin--接口类.枚举类详解.当然,在Koltin中,除了接 ...

  6. Kotlin——最详细的抽象类(abstract)、内部类(嵌套类)详解

    如果您对Kotlin很有兴趣,或者很想学好这门语言,可以关注我的掘金,或者进入我的QQ群大家一起学习.进步. 欢迎各位大佬进群共同研究.探索QQ群号:497071402 进入正题 在前面几个章节中,详 ...

  7. Kotlin——最详细的环境搭建

    众所周知,Kotlin出来已经有一段时间了.Kotlin有着众多优势,不管是用于Android开发中,还是Java开发,都能缩减很大的代码量,大大提高了工作效率.而小生本人也是才从忙碌的个工作中抽身出 ...

  8. Kotlin 初窥门径[2]:流程控制

    流程控制语句是编程语言中的核心之一.可以分为分支语句.循环语句和跳转语句.本文将详细介绍一下 Kotlin 中的流程控制语句. If 表达式 在Kotlin中一切都是表达式,也就是说一切都返回一个值. ...

  9. Kotlin——初级篇(二):变量、常量、注释

    在Kotlin中的变量.常量以及注释多多少少和Java语言是有着不同之处的.不管是变量.常量的定义方式,还是注释的使用.下面详细的介绍Kotlin中的变量.常量.注释的使用.以及和Java的对比. 如 ...

随机推荐

  1. Hibernate第四篇【集合映射、一对多和多对一】

    前言 前面的我们使用的是一个表的操作,但我们实际的开发中不可能只使用一个表的-因此,本博文主要讲解关联映射 集合映射 需求分析:当用户购买商品,用户可能有多个地址. 数据库表 我们一般如下图一样设计数 ...

  2. C# 下搭建最新版OpenCV(Emgu CV)开发环境

    既然是"最新版" 首先当然是去sf找安装包: https://sourceforge.net/projects/emgucv/files/emgucv/ 或着去github主页上c ...

  3. Mybatis学习(二)常用对象SqlSessionFactory和SqlSession

    1.SqlSessionFactory SqlSeesionFactory对象是MyBatis的关键对象,它是一个数据库映射关系经过编译后的内存镜像. SqlSeesionFactory对象的实例可以 ...

  4. Rendering Problems Failed to load platform rendering library 为何打开布局页面时手机预览页面显示不出来?

    看到图片右上角的 android图标没有?把它改为低版本的就可以了,如我的是21就可以了.原因我想是因为sdk版本更新了不兼容导致的吧.

  5. mysql更新某个字符串字段的部分内容

    如果现在需要Mysql更新字段重部分数据,而不是全部数据,应该采用何种方法呢?下面介绍了两种情况下Mysql更新字段中部分数据的方法,供您参考. Mysql更新字段中部分数据第一种情况: update ...

  6. 【转】 IntelliJ IDEA像Eclipse一样打开多个项目

    http://blog.csdn.net/zht666/article/details/47831893 我们做项目实际中经常会遇到这样的情况,创建一个common项目(Maven项目)作为公用项目, ...

  7. 在Ubuntu终端彻底删除软件

    在Ubuntu终端彻底删除软件 1.删除软件 方法一.如果你知道要删除软件的具体名称,可以使用 sudo apt-get remove --purge 软件名称 sudo apt-get autore ...

  8. Python自学笔记-filter()函数(来自廖雪峰的官网Python3)

    感觉廖雪峰的官网http://www.liaoxuefeng.com/里面的教程不错,所以学习一下,把需要复习的摘抄一下. 以下内容主要为了自己复习用,详细内容请登录廖雪峰的官网查看. Python内 ...

  9. HDU1081 最大字段和 压缩数组

    最大字段和题型,推荐做题顺序: HDU1003    HDU1024     HDU1081  zoj2975  zoj2067 #include<cstdio> #include< ...

  10. c# gdi+输出成不同mime类型的图片

    /// <summary> /// 通过图片的mime类型得到相应的编码器 /// </summary> /// <param name="mimeType&q ...