假设我要执行以下操作:
val (k, v) = pair.split("=".toRegex(), 2)
如果我总是从拆分中获得2个组件,则此代码很好-但是,如果字符串中不存在定界符,则此代码将引发异常,因为数组中的第二个元素不存在。
答案几乎肯定是“否”,但是是否有某种方法可以强制解构以将空值分配给缺少的组件?
答案 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)
}