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)
            }
        }
    }
    
  • 10
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曼诺尔雷迪亚兹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值