在不使用构造函数的情况下初始化非可选数组

时间:2019-07-01 17:08:29

标签: arrays kotlin initialization optional

我正在使用Array的非可选值,并且希望它们保持非可选值,但是由于{{3}中所述的问题,我无法使用Array的默认构造函数}}。

此外,链接中描述的.also{}技巧对我不起作用,因为我的不是具有自己的特殊WhateverArray类的某种原始类型的数组。

是否有一些Kotlin技巧可以用来初始化下面的a?还是我必须建立一些列表然后进行转换?

// please assume Stream<MyNonprimitiveType> magically gives me
// size() -> Int and
// next() -> MyNonprimitiveType
val stream : Stream<MyNonprimitiveType> = Stream<MyNonprimitiveType>()
val size : Int = stream.size()
val a : Array<MyNonprimitiveType> = ??? // use stream.next()

1 个答案:

答案 0 :(得分:2)

这是一个完整的示例,可以在不使用临时列表的情况下完成您想要的操作:

class Stream<T>(private val list: List<T>) {
    val size = list.size;
    private val it = list.iterator()

    fun next(): T {
        return it.next()
    }
}

inline fun <reified T: Any> Stream<T>.toArray(): Array<T> {
    val tmp: Array<T?> = arrayOfNulls(size)
    for (i in 0 until size) {
        tmp[i] = next()
    }
    return tmp as Array<T>
}

fun main() {
    val stream : Stream<String> = Stream(listOf("a", "b"))
    val a: Array<String> = stream.toArray()

    println(Arrays.toString(a))
}