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,还能这样的吗?这是因为kotlin的when同时支持多种不同判断,上面代码实际上等同于:

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

相关推荐
俩个逗号。。11 小时前
Kotlin flow 详解
android·开发语言·kotlin
灿飞13 小时前
Kotlin与Java虚拟机六:基础与类型系统:一切皆对象,但对象有代价
java·kotlin
alexhilton1 天前
提升 Android Compose 页面的流畅度
android·kotlin·android jetpack
灿飞1 天前
Kotlin与Java虚拟机四:一段代码的完整旅程
kotlin
Kapaseker2 天前
Kotlin 2.5 Value Class 终于能放多个属性了
android·kotlin
传奇开心果编程2 天前
【Jetpack Compose娓娓道来】第29课:状态容器与UI事件建模——把“散装状态”变成“可穷举的契约”
android·kotlin·移动开发·android jetpack·ui框架·开发范式·声明式ui
我是唐青枫4 天前
Kotlin Inheritance(继承)详解:语法、原理、实战 Demo
开发语言·kotlin
Goway_Hui4 天前
【KMP for OpenHarmony】-- 在鸿蒙工程中使用 Apollo-Kotlin
华为·kotlin·harmonyos
释厄6235 天前
AI 军备竞赛悖论——为 AI 卖游戏但 AI 需要游戏母场景
人工智能·游戏·kotlin
D e re k ZH5 天前
保序回归:从 PAVA 到可并堆的单调约束优化
c++·算法·数据挖掘·回归·kotlin