将键值映射到Kotlin中的Dataclass
如何根据数据类的名称设置其属性。例如,我有一个原始HTTP GET响应将键值映射到Kotlin中的Dataclass,kotlin,Kotlin,如何根据数据类的名称设置其属性。例如,我有一个原始HTTP GET响应 propA=valueA propB=valueB 以及Kotlin中的一个数据类 data class Test(var propA: String = "", var propB: String = ""){} 在我的代码中,我有一个将响应拆分为键值数组的函数 val test: Test = Test() rawResp?.split('\n')?.forEach { item: String ->
propA=valueA
propB=valueB
以及Kotlin中的一个数据类
data class Test(var propA: String = "", var propB: String = ""){}
在我的代码中,我有一个将响应拆分为键值数组的函数
val test: Test = Test()
rawResp?.split('\n')?.forEach { item: String ->
run {
val keyValue = item.split('=')
TODO
}
}
在JavaScript中,我可以执行以下操作
response.split('\n').forEach(item => {
let keyValue = item.split('=');
this.test[keyValue[0]] = keyValue[1];
});
Kotlin中有类似的方法吗?问题是,我不清楚每一行是否代表一个测试实例。所以 如果没有
fun parse(rawResp: String): Test = rawResp.split("\n").flatMap { it.split("=") }.let { Test(it[0], it[1]) }
如果有的话
fun parse(rawResp: String): List<Test> = rawResp.split("\n").map { it.split("=") }.map { Test(it[0], it[1]) }
fun parse(rawrep:String):List=rawrep.split(“\n”).map{it.split(“=”}.map{Test(it[0],it[1]))
对于空安全的替代方案,您可以使用
nullableString.orEmpty()…
在Kotlin中,您不能像在JavaScript中那样轻松地执行此操作(除非您自己准备好处理反射),但是可以使用名为的Kotlin特性(特别是该特性的用例)
以下是您原始问题中特定于代码的示例:
class Test(private val map: Map<String, String>) {
val propA: String by map
val propB: String by map
override fun toString() = "${javaClass.simpleName}(propA=$propA,propB=$propB)"
}
fun main() {
val rawResp: String? = """
propA=valueA
propB=valueB
""".trimIndent()
val props = rawResp?.split('\n')?.map { item ->
val (key, value) = item.split('=')
key to value
}?.toMap() ?: emptyMap()
val test = Test(props)
println("Property 'propA' of test is: ${test.propA}")
println("Or using toString: $test")
}
不幸的是,您无法按预期的方式使用属性委托,因此如果需要,您必须自己“付费”并定义重写的方法(toString
,equals
,hashCode
)
Property 'propA' of test is: valueA
Or using toString: Test(propA=valueA,propB=valueB)