如何在 kotlin 中从数据 class 的构造函数初始化 'MutableMap'?
How to initialise 'MutableMap' from constructor of data class in kotlin?
我有一个 data class
有一个 constructor
像这样 ():
data class MyDataClass (
val myArr: ArrayList<Char>
) {
constructor(n: Int):
this(
ArrayList((0 until n).map { ('A' + it).toChar() })
)
}
举个例子:
println(MyDataClass(3).myArr)
会给我:
[A, B, C]
我想像这样进一步修改我的data class
:
data class MyDataClass (
val myArr: ArrayList<Char>,
val myMap: MutableMap<Char, MutableMap<String, String>>
) {
constructor(n: Int):
this(
ArrayList((0 until n).map { ('A' + it).toChar() }),
mutableMapOf()
)
}
现在,当我打印 myMap
时:
println(MyDataClass(3).myMap)
我得到:
{}
现在,我想要的不是 myMap
的空 MutableMap
,而是像这样的 MutableMap
:
println(MyDataClass(3).myMap)
{A={}, B={}, C={}}
我该怎么做?
您可以执行以下操作之一:
- 将初始化逻辑提取到伴随函数中:
data class MyDataClass(
val myArr: ArrayList<Char>,
val myMap: MutableMap<Char, MutableMap<String, String>>
) {
constructor(n: Int) : this(
ArrayList(foo(n)),
foo(n).map { it to mutableMapOf<String, String>() }.toMap().toMutableMap()
)
companion object {
fun foo(n: Int) = (0 until n).map { ('A' + it) }
}
}
- 添加中间构造函数
data class MyDataClass(
val myArr: ArrayList<Char>,
val myMap: MutableMap<Char, MutableMap<String, String>>
) {
constructor(n: Int) : this(ArrayList((0 until n).map { ('A' + it) }))
constructor(list: ArrayList<Char>) : this(
list,
list.map { it to mutableMapOf<String, String>() }.toMap().toMutableMap()
)
}
我不确定我是否完全理解这种选择构造函数参数背后的原因,但我会说你只需要一个构造函数,因为一切都是从你接受的 int
参数构建的显式构造函数。从那里开始,我会将代码简化为如下所示:
data class Thingamajigg(val n: Int) {
val myArr: ArrayList<Char> = arrayListOf()
val myMap: MutableMap<Char, MutableMap<String, String>> = mutableMapOf()
init {
(0..n).forEach { myArr.add('A' + it) }
myArr.forEach { myMap[it] = mutableMapOf() }
}
}
符合您的需求吗?
我有一个 data class
有一个 constructor
像这样 (
data class MyDataClass (
val myArr: ArrayList<Char>
) {
constructor(n: Int):
this(
ArrayList((0 until n).map { ('A' + it).toChar() })
)
}
举个例子:
println(MyDataClass(3).myArr)
会给我:
[A, B, C]
我想像这样进一步修改我的data class
:
data class MyDataClass (
val myArr: ArrayList<Char>,
val myMap: MutableMap<Char, MutableMap<String, String>>
) {
constructor(n: Int):
this(
ArrayList((0 until n).map { ('A' + it).toChar() }),
mutableMapOf()
)
}
现在,当我打印 myMap
时:
println(MyDataClass(3).myMap)
我得到:
{}
现在,我想要的不是 myMap
的空 MutableMap
,而是像这样的 MutableMap
:
println(MyDataClass(3).myMap)
{A={}, B={}, C={}}
我该怎么做?
您可以执行以下操作之一:
- 将初始化逻辑提取到伴随函数中:
data class MyDataClass(
val myArr: ArrayList<Char>,
val myMap: MutableMap<Char, MutableMap<String, String>>
) {
constructor(n: Int) : this(
ArrayList(foo(n)),
foo(n).map { it to mutableMapOf<String, String>() }.toMap().toMutableMap()
)
companion object {
fun foo(n: Int) = (0 until n).map { ('A' + it) }
}
}
- 添加中间构造函数
data class MyDataClass(
val myArr: ArrayList<Char>,
val myMap: MutableMap<Char, MutableMap<String, String>>
) {
constructor(n: Int) : this(ArrayList((0 until n).map { ('A' + it) }))
constructor(list: ArrayList<Char>) : this(
list,
list.map { it to mutableMapOf<String, String>() }.toMap().toMutableMap()
)
}
我不确定我是否完全理解这种选择构造函数参数背后的原因,但我会说你只需要一个构造函数,因为一切都是从你接受的 int
参数构建的显式构造函数。从那里开始,我会将代码简化为如下所示:
data class Thingamajigg(val n: Int) {
val myArr: ArrayList<Char> = arrayListOf()
val myMap: MutableMap<Char, MutableMap<String, String>> = mutableMapOf()
init {
(0..n).forEach { myArr.add('A' + it) }
myArr.forEach { myMap[it] = mutableMapOf() }
}
}
符合您的需求吗?