Kotlin的whenif 和循环语句

Posted 古月书斋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin的whenif 和循环语句相关的知识,希望对你有一定的参考价值。

本文整理自:https://chiclaim.blog.csdn.net/article/details/88624808

一. when语句

在 Java 中有 switch 语句,在 Kotlin 中使用 when 来代替 switch

1) when 的基本语法

when(parameter)
    branch1 -> logic
    branch2 -> logic

when 括号里是参数,参数是可选的。箭头(->) 左边是条件分支,右边是对应的逻辑体

when 不需要向 switch 那样需要加上 break 语句,符合条件自动具有 break 功能

如果逻辑体代码比较多,可以放到花括号()里:

when(parameter)
    branch1 -> 
        //...
    
    branch1 -> 
        //...
    

如果要组合多个分支,可以使用逗号(,)分隔分支:

when(parameter)
    branch1,branch1 -> 
        //...
    

2) 枚举类对象作为 when 参数

fun getMnemonic(color: Color) = when (color) 
     Color.RED -> "Richard" 
     Color.ORANGE -> "Of" 
     Color.YELLOW -> "York" 
     Color.GREEN -> "Gave" 
     Color.BLUE -> "Battle" 
     Color.INDIGO -> "In" 
     Color.VIOLET -> "Vain"


需要注意的是,when 使用枚举对象作为参数,需要把该枚举类的所有对象列举完

所以 枚举对象作为 when 参数不需要 else 分支

3) 任意对象作为 when 参数

Kotlin 中的 when 比 Java 中的 switch 功能更强大

Java 的 switch 参数只能是 枚举常量、字符串、整型或整型的包装类型(浮点型不可以)

Kotlin 的 when 可以是任意对象:

fun mix(c1: Color, c2: Color) = when (setOf(c1, c2)) 
    
    setOf(RED, YELLOW) -> ORANGE 
    
    setOf(YELLOW, BLUE) -> GREEN 
    
    setOf(BLUE, VIOLET) -> INDIGO
    
    //需要处理 其他 情况
    else -> throw Exception("Dirty color") 

4) 无参数的 when 表达式

上面的 mix 函数比较低效,因为每次比较的时候都会创建一个或多个 set 集合

如果该函数调用频繁,会创建很多临时对象

可以使用无参的 when 表达式来改造下:

fun mixOptimized(c1: Color, c2: Color) = when 
    (c1 == RED && c2 == YELLOW) || (c1 == YELLOW && c2 == RED) ->
        ORANGE
    (c1 == YELLOW && c2 == BLUE) || (c1 == BLUE && c2 == YELLOW) ->
        GREEN
    (c1 == BLUE && c2 == VIOLET) || (c1 == VIOLET && c2 == BLUE) ->
        INDIGO
    else -> throw Exception("Dirty color")

无参数的 when 表达式的条件分支必须是 boolean 类型

5) 智能类型转换(smart casts)

在 Java 中对某个对象进行类型转换的时候时候,需要通过 instanceof 来判断是否可以被强转

void test(Object obj) 
    if (obj instanceof String) 
        String str = (String) obj;
        str.substring(0, str.length() / 2);
    
    //...


Kotlin 通过 is 关键字来判断类型,并且编译器会自动帮你做类型转换

fun test(obj: Any) 
    if (obj is String) 
        // 不需要手动做类型转换操作
        obj.substring(0, obj.length / 2)
    
    //...

二. if判断

if 表达式 用于条件判断,在 Kotlin 中 如果判断分支比较多,通常使用 when 来替代 if

fun test(obj: Any) 
    when (obj) 
        is String -> obj.substring(0, obj.length / 2)
        is Type2 -> ignore
        is Type3 -> ignore
    

三. while循环

Kotlin 中的 while 和 do…while 循环和 Java 没有什么区别

while (condition) 
    /*...*/


do 
    /*...*/
 while (condition)

四. for循环

for 循环的语法和 Java 中的循环还是有些区别

// Java for 循环
for (int i = 0; i <= 100; i++) 
    System.out.println(i);


// 对应 Kotlin 版本
for(i in 0..100)
    println(i)

使用  操作符 表示一个区间,该区间是闭区间,包含开始和结束的元素

然后使用 in 操作符来遍历这个区间

这个区间是从小到大的,如果开始的数字比结尾的还要大,则没有意义

如果想要表示 半闭区间 ,即只包含头部元素,不包含尾部

可以使用 until 操作符:

for(i in 0 until 100)
    println(i)

如果想要倒序遍历,可以使用 downTo 关键字:

for(i in 100 downTo 0)
    println(i)

遍历的时候 步长(step) 默认是 1,可以通过 step 关键字来指定步长

for( i in 100 downTo 0 step 2)
    println(i)

操作符  和 downTo 表示区间都是闭区间,包含首尾元素的

以上是关于Kotlin的whenif 和循环语句的主要内容,如果未能解决你的问题,请参考以下文章

Kevin Learn Kotlin:循环控制

Kotlin语言的程序的逻辑控制和循环结构

Kotlin 条件循环控制使用

Kotlin 条件循环控制使用

Kotlin 条件循环控制使用

Kotlin小笔记kotlin的基本语法