将键值映射到 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 ->
run {
val keyValue = item.split('=')
TODO
}
}

在JavaScript中,我可以执行以下操作

response.split('n').forEach(item => {
let keyValue = item.split('=');
this.test[keyValue[0]] = keyValue[1];
});

在 Kotlin 中有类似的方法吗?

你不能像在 JavaScript 中那样轻松地在 Kotlin 中做到这一点(除非你准备自己处理反射(,但有可能使用称为委托属性的 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")
}

这输出:

Property 'propA' of test is: valueA
Or using toString: Test(propA=valueA,propB=valueB)

不幸的是,你不能按照你期望的方式使用带有属性委托的数据类,所以你必须"付出代价",并在需要时自己定义被覆盖的方法(toStringequalshashCode(。

通过这个问题,我不清楚每行是否代表一个测试实例。所以

如果没有。

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]) }

对于空安全替代方案,您可以使用nullableString.orEmpty()...

最新更新