Pattern matching in Kotlin is nice and the fact it does not execute the next pattern match is good in 90% of use cases.

在Android中,当数据库更新时,如果我们不中断代码如下所示,我们将使用Java Switch属性继续下一种情况:

switch (oldVersion) {
    case 1: upgradeFromV1();
    case 2: upgradeFromV2(); 
    case 3: upgradeFromV3();
}

因此,如果某人有一个DB版本为1的应用程序,但错过了DB v2的应用程序版本,他将执行所有需要的升级代码.

改用Kotlin 后,我们会看到一团糟,比如:

when (oldVersion) {
    1 -> {
        upgradeFromV1()
        upgradeFromV2()
        upgradeFromV3()
    }
    2 -> {
        upgradeFromV2()
        upgradeFromV3()
    }
    3 -> {
        upgradeFromV3()
    }
}

这里我们只有3个版本,想象一下当DB达到版本19时.

Anyway to makes when acting in the same way then switch? I tried to continue without luck.

推荐答案

Simple but wordy solution is:

if (oldVersion <= 1) upgradeFromV1()
if (oldVersion <= 2) upgradeFromV2()
if (oldVersion <= 3) upgradeFromV3()

另一个可能的解决方案是function references:

fun upgradeFromV0() {}
fun upgradeFromV1() {}
fun upgradeFromV2() {}
fun upgradeFromV3() {}

val upgrades = arrayOf(::upgradeFromV0, ::upgradeFromV1, ::upgradeFromV2, ::upgradeFromV3)

fun upgradeFrom(oldVersion: Int) {
    for (i in oldVersion..upgrades.lastIndex) {
        upgrades[i]()
    }
}

Kotlin相关问答推荐

Lambda和普通Kotlin函数有什么区别?

在KMP中使用koin将来自Android的上下文注入到SQLDelight Driver中

在Kotlin Jetpack中重用下拉菜单

在 Kotlin 中,为什么我们要在闭包中捕获值

为什么 <= 可以应用于 Int 和 Long,而 == 不能?

Kotlin .如何用从 1 到 90 的 5 个唯一数字填充列表中的每一行?

Kotlin 中的 maxOf() 和 max() 方法有什么区别?

Kotlin:调用 CoroutineScope.launch 与在协程内启动之间的区别

jlink:在合并模块和 kotlin.stdlib 中打包 kotlin.*

在 Kotlin 中,为什么在 `+` 之前但在 `.` 之前没有换行符?

Jetpack Compose:当状态从另一个活动改变时强制重组

Mixin 在 Jackson 中添加 defaultImpl 不起作用

Kotlin 中获取类简单名称的最佳实践

从字符串列表构建字符串

Kotlin-Java 互操作不能与可变参数一起使用

Kotlin惰性默认属性

如何从kotlin中的类实例化对象

Dagger +Kotlin 不注入

可以在函数参数中使用解构吗?

如何修复未解析的参考生命周期范围?