创建具有固定大小和空值的列表,然后修改Kotlin

gr8qqesn  于 2023-06-24  发布在  Kotlin
关注(0)|答案(3)|浏览(144)

我有课

data class A(
        var id: Long? = null,
        var desc: String,
        var cnt: String
)

我想创建一个列表,其中包含5个类A类型的元素,所有元素都是唯一的,并且使用函数式编程风格。比如说

[A(id=1, desc="t1", cnt="s1"), A(id=2, desc="t2", cnt="s2"), A(id=3, desc="t3", cnt="s3"), A(id=4, desc="t4", cnt="s4"), A(id=5, desc="t5", cnt="s5")]

我试着这样做,但在我看来有一个更理想的方式(如果我想要100尺寸…)

val aList = mutableOf<A>(null, null, null, null, null)
        aList.forEachIndexed { index, _ ->
            x = createA() // here an entity is created and a unique id is assigned
            alist[index] = A(
                    id = x.id,
                    desc = x.desc+index,
                    cnt= x.cnt+index
            )
svgewumm

svgewumm1#

除了创建一个可变列表和使用forEachIndexed,你可以使用一个类似构造函数的函数来处理带有lambda的列表(源代码)。
此外,请考虑使用字符串模板而不是串联:

data class A(
    var id: Long? = null,
    var desc: String,
    var cnt: String
)

fun main() {
    val aList = List(5) { index ->
        A(
            id = (index + 1).toLong(),
            desc = "t${index + 1}",
            cnt = "s${index + 1}"
        )
    }
    println(aList)
}

输出:

[A(id=1, desc=t1, cnt=s1), A(id=2, desc=t2, cnt=s2), A(id=3, desc=t3, cnt=s3), A(id=4, desc=t4, cnt=s4), A(id=5, desc=t5, cnt=s5)]

here!

im9ewurl

im9ewurl2#

您可以使用List工厂函数创建一个所需大小的列表,并使用lambda指定每个索引的元素应该是什么:

val aList = List(5) { index ->
    val x = createA()
    A(
        id = x.id,
        desc = x.desc + index,
        cnt = x.cnt + index
    )
    // or use the copy method on data classes:
    // x.copy(desc = x.desc + index, cnt = x.cnt + index)
}

也就是说,创建一个A似乎有点浪费,只是为了创建另一个具有一些不同属性的A。考虑让createA接受一个Int参数,当然,如果可以更改它的话。

val aList = List(5) { index ->
    createA(index)
}
// or written with a function reference
val aList = List(5, ::createA)
vmdwslir

vmdwslir3#

你可以用 n..m(Ranges)创建一个范围,然后使用map创建条目:

val result = (1..5).map { A(id = it.toLong(), desc = "t$it", cnt = "s$it") }

或者如果元素计数的值存储在变量中:

val count = 5
val list = (1..count).map { ...

请注意,n..m 的语法创建了IntRange。对于LongRange,没有短语法,只使用构造函数,但另一方面,.toLong() 转换可以被删除:

val list = LongRange(1, 5).map { A(id = it, desc = "t$it", cnt = "s$it") }

相关问题