组件数量少于预期的组件解构

Component destructuring with fewer than expected components

假设我想执行以下操作:

val (k, v) = pair.split("=".toRegex(), 2)

如果我总是从拆分中得到 2 个组件,则此代码没有问题 - 但是,如果字符串中不存在定界符,则此代码会引发异常,因为数组中的第二个元素不存在。

答案几乎肯定是"no",但是有没有什么方法可以强制解构以将空值分配给缺失的组件?

它对我有用

val pair="your string"
if(pair.isNotEmpty()&&pair.contains("=")) {
    val (k, v) = pair.split("=".toRegex(), 2)
    println(k)
    println(v)
}

您可以将自己的扩展添加到 List,将所需数量的 null 个值添加到末尾:

val (k, v) = pair.split("=".toRegex(), 2).padWithNulls(limit = 2)

可以通过多种方式实现,这里只是其中一种:

private inline fun <reified E> List<E>.padWithNulls(limit: Int): List<E?> {
    if (this.size >= limit) {
        return this
    }

    val result: MutableList<E?> = this.toMutableList()
    result.addAll(arrayOfNulls(limit - this.size))
    return result
}

这里还有一个更简单的:

private fun <E> List<E>.padWithNulls(limit: Int): List<E?> {
    val result: MutableList<E?> = this.toMutableList()

    while (result.size < limit) {
        result.add(null)
    }

    return result
}

或进一步包装此功能:

val (k, v) = pair.splitAndPadWithNulls("=".toRegex(), 2)

private fun String.splitAndPadWithNulls(regex: Regex, limit: Int): List<String?> {
    return this.split(regex, limit).padWithNulls(limit)
}

解构对象时,Kotlin 会为该对象调用 componentN()。对于数组,component1()等于get(0)component2()等于get(1),依此类推。

所以如果索引越界,它会抛出 ArrayIndexOutOfBoundsException,而不是返回 null


但是您可以使您的运算符函数像这样:

operator fun <T> Array<out T>.component1(): T? = if (size > 0) get(0) else null
operator fun <T> Array<out T>.component2(): T? = if (size > 1) get(1) else null

所以如果我 运行

val (k, v) = arrayOf(1)

println(k)
println(v)

输出将是

1
null

参见: