Kotlin Destructuring when/if声明

Rob*_*son 11 java string kotlin

所以我有一个字符串,我想检查是否应分成两部分,或返回一些默认值.像这样:

val myString = "firstPart-secondPart"
val (first, second) = when (myString.contains("-")) {
        true -> myString.split('-', limit = 2)
        else -> ?? <-- How would i return ("Default1", "Default2") so the destructuring still works?
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,我如何返回两个默认字符串,以便解构工作?我之前用过的String.split()是为了解构而且非常好.

jrt*_*ell 13

如何返回2个用于解构的值

您需要返回与上述类型匹配的类型,split返回一个列表,因此您可以使用:

listOf("Default1", "Default2")
Run Code Online (Sandbox Code Playgroud)

完整代码

val myString = "firstPart-secondPart"
val (first, second) = when (myString.contains("-")) {
        true -> myString.split('-', limit = 2)
        else -> listOf("Default1", "Default2")
}
Run Code Online (Sandbox Code Playgroud)

为什么会这样

当两个分支都返回时,List<String>你可以将整个块作为a处理List<String>,因此它可以被解构以从中获取值.

可能的清理

val myString = "firstPart-secondPart"
val (first, second) = when {
    myString.contains("-") -> myString.split('-', limit = 2)
    else -> listOf("Default1", "Default2")
}   
Run Code Online (Sandbox Code Playgroud)

假设您要添加更多条件,这可能更有意义,否则if可能更有意义.


s1m*_*nw1 6

作为jrtapsell良好且正确答案的替代方案,您可以使用 destructed Pairs

val (first, second) = when (myString.contains("-")) {
    true -> myString.split('-', limit = 2).let { it[0] to it[1] }
    else -> "Default1" to "Default2"
}
Run Code Online (Sandbox Code Playgroud)

Pair注 1:带有两个元素的结果列表在 的帮助下转换为 a let
注2:这里使用infix函数toPair来创建s。