kotlin中的when

今天看到一个kotlin源码,有点奇怪:

kotlin 复制代码
public fun <T> Comparator<T>.reversed(): Comparator<T> = when (this) {
    is ReversedComparator -> this.comparator
    NaturalOrderComparator -> @Suppress("UNCHECKED_CAST") (ReverseOrderComparator as Comparator<T>)
    ReverseOrderComparator -> @Suppress("UNCHECKED_CAST") (NaturalOrderComparator as Comparator<T>)
    else -> ReversedComparator(this)
}

这里很奇怪,为什么第一个分支有is,后面两个没有is,还能这样的吗?这是因为kotlinwhen同时支持多种不同判断,上面代码实际上等同于:

kotlin 复制代码
if (this is ReversedComparator) {
    ...
} else if (this == NaturalOrderComparator) {
    ...
} else if (this == ReverseOrderComparator) {
    ...
}

第一个是判断类型,后面两个是判断对象相等,因为那两个对象是单例(object NaturalOrderComparator),所以直接写了类名,感觉以为是在判断类型,其实是判断是否相等。when支持同时使用各种判断,示例如下:

kotlin 复制代码
when (x) {
    1 -> ...	// 值匹配
    "abc" -> ... // 值匹配
    MySingleton -> ... // 值匹配,单例
    99, 999, 9999 -> ... // 匹配多个值
    in 1..10 -> ... // 匹配在某个区间
    !in 11..20 -> ... // 匹配不在某个区间
    is Int -> ... // 匹配是某个类型
    !is String -> ... // 匹配不是某个类型
}

如果想要表达大于或小于某个值,或者想要任意表达式,则when后面不能加括号,示例如下:

kotlin 复制代码
when {
    x > 10 -> println("")
    a is String -> println("")
}

这个写法更强大,没有了括号的限制,只要是一个Boolean表达式就可以用作它的分支。

相关推荐
Android-Flutter9 小时前
Android 内存泄漏详解
android·kotlin
Android-Flutter10 小时前
android Handler , Looper , Message , MessageQueue 详解
android·kotlin
阿pin12 小时前
Android随笔-kotlin Flow
android·kotlin·flow
松仔log12 小时前
JetPack——Hilt
android·java·开发语言·kotlin
chjif13 小时前
Android 设备管控开发实战:常见保活与拉活方案怎么组合,实测能到什么程度?
android·kotlin
XiaoLeisj13 小时前
Kotlin Flow 常用操作符:数据变换 map、filter、onEach,时间控制 debounce、sample,终端聚合 reduce、fold
android·kotlin·android jetpack·协程·响应式编程·flow
Kapaseker14 小时前
小白都看得懂的 Skill 教程 - 创建第一个 Skill
android·kotlin·vibecoding
zhangphil14 小时前
Android BitmapFactory实现AOSP ContentResolver.loadThumbnail快速取小缩略图,Kotlin
android·kotlin
Android-Flutter14 小时前
android 生命周期管理,继承Activity,不是AppCompatActivity
android·kotlin
XiaoLeisj2 天前
Kotlin Flow:冷流收集、并行订阅、emit 推送、delay 延迟、collect 全量收集与 collectLatest 的实时数据处理
android·kotlin·android jetpack·协程·flow