组件分解少于预期的组件

时间:2018-07-30 05:20:55

标签: kotlin destructuring

假设我要执行以下操作:

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

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

答案几乎肯定是“否”,但是是否有某种方法可以强制解构以将空值分配给缺少的组件?

3 个答案:

答案 0 :(得分:3)

在分解对象时,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

请参阅:

答案 1 :(得分:2)

您可以将自己的扩展名添加到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)
}

答案 2 :(得分:0)

对我有用

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