Kotlin(Android) - 为非变量函数传播数组/列表

时间:2018-04-18 06:40:34

标签: android arrays kotlin arguments variadic-functions

我有一个数据类,即:

val data = arrayOf("x", "y", "z", "a", "b")

我有一个字符串数组:data

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

我尝试过使用点差运算符:vararg但是它给出了一个错误,说明这里不允许使用点差运算符。这是因为参数不是varargs。另请注意,数据类的构造函数中不允许component1(), component2()...

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

在各种搜索之后,我还没有找到答案。可以使用一些帮助。感谢。

编辑:对于数组/列表的前5个元素,Kotlin中的集合确实有component5()个方法一直到val (a, b, c, d, e) = data。因此,这允许进行解构赋值:Entry(a, b, c, d, e)。然后你可以将它们传递给函数/构造函数:Map(s -> 3, h -> 2, M -> 1, q-> 4)

但这只是解决方案的一半,因为你只限于前5个元素,而且它比简单的点差运算符更冗长。

2 个答案:

答案 0 :(得分:1)

我认为你最好的办法是让你的构造函数变得私有,而是依赖工厂方法。通常应将构造函数视为较低级别的特性,只需从给定值进行简单初始化即可。

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

请注意,没有什么可以阻止您宣布其他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)

答案 1 :(得分:0)

您可以创建扩展乐趣

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