Kotlin Destructuring when / if声明

时间:2018-03-13 12:52:05

标签: 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?
}

所以我的问题是,我如何返回两个默认字符串,以便解构有效?我之前使用过String.split()来解构它并且非常好。

2 个答案:

答案 0 :(得分:13)

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

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

listOf("Default1", "Default2")

完整代码

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

为什么会这样?

当两个分支返回List<String>时,您可以将整个块视为List<String>,因此可以对其进行解构以从中获取值。

可能的清理

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

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

答案 1 :(得分:1)

作为jrtapsell的正确答案的替代方法,您可以使用结构化Pairs

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

注1:带有两个元素的结果列表在let的帮助下转换为Pair
注意2:infix function to用于在此创建Pair