组件数量少于预期的组件解构
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
参见:
假设我想执行以下操作:
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
参见: