Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将键值映射到Kotlin中的Dataclass_Kotlin - Fatal编程技术网

将键值映射到Kotlin中的Dataclass

将键值映射到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 ->

如何根据数据类的名称设置其属性。例如,我有一个原始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中有类似的方法吗?

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

如果没有

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)