Kotlin (Android) - 为非可变函数传播一个 Array/List

Kotlin (Android) - Spread an Array/List for Non-Variadic Functions

我有一个数据class即:

data class Entry(var name: String, var address: String, var phoneNo: String,
                 private val amt: String, var remark: String)

我有一个字符串数组:val data = arrayOf("x", "y", "z", "a", "b")

我想在创建 Entry 的新实例时将 data 数组作为参数传递。我不想这样做:val entry = Entry(data[0], data[1], data[2], data[3], data[4])

我试过使用扩展运算符:Entry(*data) 但它给我一个错误,提示此处不允许使用扩展运算符。这是因为该参数不是 vararg。另外,请注意 varargs 在数据 classes.

的构造函数中是不允许的

在 Kotlin 中有什么方法可以将数组扩展到非可变函数(具有固定数量参数的函数),特别是如果您知道该数组的长度将始终相同?

经过各种搜索,我还没有找到答案。需要一些帮助。谢谢。

编辑: Kotlin 中的集合确实有 component1(), component2()... 方法一直到 component5() array/list 的前 5 个元素。所以这允许一个人做一个解构赋值:val (a, b, c, d, e) = data。然后你可以将它们传递给 function/constructor:Entry(a, b, c, d, e).

但这只是解决方案的一半,因为您仅限于前 5 个元素,而且它仍然比简单的展开运算符更冗长。

我认为您最好的办法是将您的构造函数设为私有并改为依赖工厂方法。构造函数通常应该被视为一个较低级别的功能,它只是根据给定的值进行简单的初始化。

因此声明一个可变参数工厂方法,该方法具有将数据从数组中铲到构造函数的所有样板。您可以使用解构赋值来稍微改善代码的外观。

请注意,没有什么可以阻止您将其他 Array.componentN 声明为扩展函数:

fun entry(args: Array<String>) = args.let {
    (name, address, phoneNo, amt, remark, oneMore) -> 
    Entry(name, address, phoneNo, amt, remark, oneMore)
}

operator fun <T> Array<T>.component6() = get(5)

您可以创造扩展的乐趣

inline fun Array<String>.toEntry() = Entry(
    this[0],
    this[1],
    this[2],
    this[3],
    this[4]
)