如何在Kotlin函数中解构传入的List<Int>集合?
Kotlin中解构List为多变量的正确方法
你遇到的问题本质是:Kotlin标准库仅为List实现了component1()到component5()这五个解构函数,直接尝试解构6个元素时,编译器找不到对应的component6()方法,导致失败。下面提供几种可行的解决方案:
方案1:为List扩展component6()函数
通过扩展函数给List添加第6个解构方法,就能直接使用你想要的解构语法:
import java.util.Scanner const val HOURS = 3600 const val SECONDS = 60 // 扩展List的component6函数,支持第6个元素的解构 operator fun <T> List<T>.component6(): T = this[5] fun secondsBetweenTwoMoments(timeData: List<Int>): Int { require(timeData.size == 6) { "List must have exactly 6 elements" } // 现在可以直接解构6个元素了 val (h1, m1, s1, h2, m2, s2) = timeData val seconds1 = h1 * HOURS + m1 * SECONDS + s1 val seconds2 = h2 * HOURS + m2 * SECONDS + s2 return seconds2 - seconds1 } fun main() { val scanner = Scanner(System.`in`) val inputs = mutableListOf<Int>() repeat(6) { inputs.add(scanner.nextInt()) } val seconds = secondsBetweenTwoMoments(inputs) println(seconds) }
方案2:将List转为Array后解构
Kotlin的Array支持任意长度的解构(只要数组元素数量足够),可以先把List转成TypedArray再解构:
fun secondsBetweenTwoMoments(timeData: List<Int>): Int { require(timeData.size == 6) { "List must have exactly 6 elements" } // 转成Array后解构 val (h1, m1, s1, h2, m2, s2) = timeData.toTypedArray() val seconds1 = h1 * HOURS + m1 * SECONDS + s1 val seconds2 = h2 * HOURS + m2 * SECONDS + s2 return seconds2 - seconds1 }
方案3:拆分List后分别解构
如果不想扩展函数或转Array,也可以把List拆分成两个子列表分别解构:
fun secondsBetweenTwoMoments(timeData: List<Int>): Int { require(timeData.size == 6) { "List must have exactly 6 elements" } val (h1, m1, s1) = timeData.subList(0, 3) val (h2, m2, s2) = timeData.subList(3, 6) val seconds1 = h1 * HOURS + m1 * SECONDS + s1 val seconds2 = h2 * HOURS + m2 * SECONDS + s2 return seconds2 - seconds1 }
补充说明
解构语法的核心是componentN()函数,Kotlin标准库为集合类提供的解构支持有限:
List/Set仅支持前5个元素的解构(component1到component5)Array则没有数量限制,只要数组长度大于等于解构的元素数量即可
内容的提问来源于stack exchange,提问作者Technophobe01
相关产品推荐
相关产品推荐

