Kotlin语法快速入门--条件控制和循环语句(2)

Kotlin语法入门–条件控制和循环语句(2)

二、条件控制和循环语句

1、if…else

常规分支:

fun main() {
    var a = 1
    if (a == 1) {
        println("a is 1")
    } else {
        println("a is not 1")
    }
}

kotlin新特性:if语句可以有返回值

fun main() {
    var a = 1
    val b = if (a == 1) {
        3
    } else {
        4
    }
    println(b)
}

像上述这种,假如条件成立,则赋值给a,返回值不用return 即可返回。

但是,注意的是假如要有返回值,则必须要写else分支。

image-20240417153651819

多分支已是如此:

fun main() {
    var a = 1
    val b = if (a == 1) {
        3
    } else if(a==3)  {
        4
    }else{
        5
    }
    println(b)
}

由于kotlin没有三元表达式,所以,可以使用if及其分支拟造一个三元表达式:

fun main() {
 var a = 1
 var b = 2
 val c = if (a == b) true else false
 println(c)
}

2、when

2.1、常规用法

关于when的用法,可以对标Java中的Switch,示例代码如下:

fun main() {
    var a = 1
    when (a) {
        1 -> println("a is 1")
        2 -> println("a is 2")
        else -> println("a is null")
    }

}

其中,else是默认输出语句,对标Java中的default

2.2、特殊用法–并列:
fun main() {
    var a = 1
    when (a) {
        1,3 -> println("a is 1")  //1或3
        2 -> println("a is 2")
        else -> println("a is null")
    }
}
2.3、特殊用法–类型判断:
fun main() {
    var a: Any = 1
    when (a) {
        is Int -> println("a is Int")
        is String -> println("a is String")
        else -> println("a is else")
    }
}
2.4、特殊用法–区间:
fun main() {
    var a: Any = 1
    when (a) {
        in 1..10 -> println("a is in range")
        is String -> println("a is a String")
        else -> println("none of the above")
    }
}

值得注意的是,每当判断到成立条件的时候,下面的条件不管成立否都不会执行。

还有,多个条件可以并列写,例如:

fun main() {
 var a: Any = 11
 when (a) {
     in 1..10,is Int -> println("a is in range or is Int")
     else -> println("none of the above")
 }
}
2.5、返回值

与if一样,kotlin的when也可以带上返回值,将返回值写在执行的最后一样即可:

fun main() {
    var a: Any = 11
    val b = when (a) {
        in 1..10 -> {
            println("a is in range")
            1
        }
        is Int -> {
            println("a is a Int")
            2
        }
        else -> {
            println("none of the above")
            3
        }
    }
    println(b)
}

3、循环

3.1、for…in
fun main() {
    var list = (1..<20).toList()
    for (i in list) {
        println(i)
    }
}
3.2、forEach

下述的forEach其实就是对原有的方法进行扩展,

fun main() {
    var list = (1..<20).toList()
    list.forEach {
        println(it)
    }
}

其循环默认名字是it,也可以用自定义的名字,例如下面value->:

fun main() {
    var list = ('a'..<'z').toList()
    list.forEach {value->
         println(value)
    }
}

其实其底层也就是一个lamda表达式进行赋值,然后进行for循环:

image-20240417164415857

3.3、迭代器

先看迭代器的方法:

image-20240417162941465

next():获取下一个元素的值,就像有一个指针,指向下一个值,并获取。

hasnext():判断是否存在下一个值,并且返回boolean值。

fun main() {
    var list = (1..<20).toList()
    var iterator = list.listIterator()
    while (iterator.hasNext()) {
        println(iterator.next())
    }
}
3.4、【扩展】for…in中的withIndex方法

image-20240417163753785

从上图可以看到,withIndex()方法要返回一个迭代器,其会返回一个对象,有下标index,和值i,可以通过kotlin的一个解构的方法获取:

fun main() {
    var list = ('a'..<'z').toList()
    for ((index,i)in list.withIndex()) {
        println("$index $i")
    }
}

输出:

image-20240417164130364

3.5、【扩展】forEachIndexed()方法
fun main() {
    var list = ('a'..<'z').toList()
    list.forEachIndexed{index, value->
         println("$index $value")
    }
}

forEachIndexed()方法:

image-20240417165201802

3.6、do…while和while

这两个语法没有变化,与常见语言的格式一样。

do…while:

fun main() {
    var i = 1
    do {
        println("$i")
    } while (i++ < 6)
}a

while:

fun main() {
    var i = 1
    while (i++ < 6) {
        println("$i")
    }
}

4、return,break,continue结束语句的使用

4.1、结束循环分支

例如:

fun main() {
    for (i in 1..10)
        for (j in 1..10) {
            if (i == 5 && j == 5) {
                break  //或者continue
            }
            println("$i $j ")
        }
}

解释:首先,break或者continue会优先执行的语句段是距离关键字(break或者continue)最近的循环关键字,所以上述代码中break的是j所在的for。

4.2、标签备注代码块–@
fun main() {
    a@for (i in 1..10)
        for (j in 1..10) {
            if (i == 5 && j == 5) {
                break@a //或者continue
            }
            println("$i $j ")
        }
}

像这段,就可以指定a@…@a这段代码区域执行break或者continue。

4.3、forEach退出循环的几种方式
fun main() {
    (1..<10).forEach {
        if (it == 5) {
            // 执行跳出循环                  
        }
        println(it)
    }
}

就像上述代码,想在it == 5的时候执行跳出循环 ,但是这个时候无法直接跳出循环,因为其底层是使用lamda表达式和函数实现的,即无法使用关键字break,continue。而使用return语句则会直接返回main函数,所以有下面几种写法:

  1. 寻找最近forEach,这样就不会打印5这个数字,就像continue一样。

    fun main() {
        (1..<10).forEach {
            if (it == 5) {
                 return@forEach // 执行跳过本次循环
            }
            println(it)
        }
    }
    
  2. a@…@a方式与return@forEach一样,跳过本次循环。

    fun main() {
        (1..<10).forEach  a@{
            if (it == 5) {
                 return@a // 执行跳过本次循环
            }
            println(it)
        }
    }
    
  3. run函数结束循环,类似于return函数那种感觉。

    fun main() {
        run {
            (1..<10).forEach{
                if (it == 5) {
                    return@run// 执行结束循环(run函数内的结束)
                }
                println(it)
            }
        }
    }
    
  4. 同理上述方法可以写成

    fun main() {
        run a@ {
            (1..<10).forEach{
                if (it == 5) {
                    return@a // 执行结束循环
                }
                println(it)
            }
        }
    }
    

相关推荐

  1. 快速入门Kotlin①基本语法

    2024-04-22 23:44:04       17 阅读
  2. Kotlin语法快速入门-区间(3)

    2024-04-22 23:44:04       12 阅读
  3. python 条件循环语句

    2024-04-22 23:44:04       14 阅读
  4. 循环控制语句的实际应用(2

    2024-04-22 23:44:04       13 阅读
  5. 条件循环语句有哪些?语法?区别?

    2024-04-22 23:44:04       7 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-22 23:44:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-22 23:44:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-22 23:44:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-22 23:44:04       18 阅读

热门阅读

  1. GRU之我见(含案例讲解)

    2024-04-22 23:44:04       14 阅读
  2. pytest前后值和@pytest.fixtrue的使用

    2024-04-22 23:44:04       7 阅读
  3. Hadoop HDFS:海量数据的存储解决方案

    2024-04-22 23:44:04       13 阅读
  4. CSS字体样式

    2024-04-22 23:44:04       10 阅读
  5. aws挂载s3

    2024-04-22 23:44:04       13 阅读
  6. TCP练习

    2024-04-22 23:44:04       13 阅读
  7. 工作与生活的平衡术:顶尖专家的十大建议

    2024-04-22 23:44:04       15 阅读
  8. 处理复杂人际关系的策略

    2024-04-22 23:44:04       18 阅读