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表达式就可以用作它的分支。

相关推荐
zhangphil19 小时前
Android Page 3 Flow读sql数据库媒体文件,Kotlin
android·kotlin
小书房19 小时前
Kotlin使用体验及理解1
android·开发语言·kotlin
Kapaseker20 小时前
我想让同事知道我很懂 Compose 怎么办?
android·kotlin
jinanwuhuaguo1 天前
OpenClaw工程解剖——RAG、向量织构与“记忆宫殿”的索引拓扑学(第十三篇)
android·开发语言·人工智能·kotlin·拓扑学·openclaw
jinanwuhuaguo2 天前
OpenClaw协议霸权——从 MCP 标准到意图封建化的政治经济学(第十八篇)
android·人工智能·kotlin·拓扑学·openclaw
zhangphil2 天前
Android sql查媒体数据封装room Dao构造AndroidViewModel,RecyclerView宫格展示,Kotlin
android·kotlin
jinanwuhuaguo2 天前
反熵共同体——OpenClaw的宇宙热力学本体论(第十七篇)
大数据·人工智能·安全·架构·kotlin·openclaw
pengyu2 天前
【Kotlin 协程修仙录 · 筑基境 · 中阶】 | 身份证与通行证:CoroutineContext 的深度解剖
android·kotlin
夏沫琅琊2 天前
android 短信读取与导出技术
android·kotlin
Kapaseker2 天前
客官,你误会 Compose Strong Skipping 了
android·kotlin