现在我的项目需要将JVM语言从Scala更改为Kotlin;但是如何使用Kotlin模式匹配作为Scala呢?

    val a: String = "a"
    val b: Int = 1
    (a, b) match {
      case (str: String, i: Int) => // do something
      case (_,_) => // do other thing
    }

对于上面的Scala代码,Kotlin代码是什么?

Kotlin模式匹配执行when,但when只接受一个参数,when可以接受多个参数吗?

推荐答案

Kotlin实际上没有patterns个,就像C#、Swift或Haskell中的recursive个模式匹配而言.

when和类似的参数seems可以进行模式匹配,但实际上,大小写在when中只支持有限数量的操作(请参见language spec):

  • 判断参数的类型-is SomeType,!is SomeType.如果判断成功,则该类型的参数也将为smart-casted.
  • 正在判断安全壳-in someCollection,!in someCollection.这基本上就是呼叫contains.
  • 根据任何其他表达式判断相等性.
  • else

你不能用其他语言做同样的事情.

假设ab的类型未知,我将使用if编写以下代码:

if (a is String && b is Int) {
    // a and b will be smart-casted inside here
} else {
    // do something else
}

如果有多个 case ,您可以使用whenwithout个参数.

// a and b will be smart-casted to the appropriate types in each case
when {
    a is String && b is Int -> ...
    a is Int && b is String -> ...
    // and so on
}

请注意,从ab算出Pair并判断配对的类型不起作用:

when (a to b) {
    is Pair<String, Int> -> ...
    ...
}

这是因为泛型类型在运行时被擦除.运行库不知道它是Pair<String, Int>Pair<Int, String>还是任何其他类型的Pair.它只能判断自己确实是一架Pair,而不是StringTriple.

Kotlin相关问答推荐

Kotlin多平台(KMP)保存到文件不能在iOS上保存

用A*搜索算法解决特修斯和米诺陶尔难题

捕捉异常是Kotlin协程中的反模式吗?

当我通过媒体通知更改音乐时不要更新我的 UI

Java/Kotlin中类似Rust般的注释编译?

Android Jetpack Compose:在空的 Compose 活动中找不到 OutlinedTextField (Material3)

为什么 trySend 会发出假数据?

如何从 var list 或可变列表中获取列表流

Kotlin spring boot @RequestBody 验证未触发

Anko 中的水平线性布局

如何从 Java 中隐藏 Kotlin 的 lateinit var 支持字段?

如何使用 Coil 从 URL 获取位图?

在 Scaffold Jetpack Compose 内的特定屏幕上隐藏顶部和底部导航器

如果 Maybe 完成,则从其他来源将 Maybe 转换为 Single

kotlin-bom 库是做什么的?

launch 仅从 Kotlin 1.3 开始可用,不能在 Kotlin 1.2 中使用

Kotlin reflect proguard SmallSortedMap

无法解决:androidx.lifecycle:lifecycle-extensions-ktx:2.0.0-alpha1

如何在 firebase 数据库中使用 kotlin 协程

为什么在 Kotlin 中return可以返回一个return?