kotlin 如何从数据类中删除第一个数据?

k2fxgqgv  于 12个月前  发布在  Kotlin
关注(0)|答案(2)|浏览(170)

假设我有两个数据类DataClass1DataClass2,其中DataClass2DataClass1相同,只是缺少第一个变量。

data class DataClass1(
    val entry0: Any,
    val entry1: Any,
...
    val entryN: Any
)

data class DataClass2(

    val entry1: Any,
...
    val entryN: Any
)

字符串
假设我有dc1作为dataClass1的一个示例,并希望获得相应的dataClass2.version(即“删除”entry0)。

dc2 = DataClass2(
val entry1 = dc1.entry1,
val entry2 = dc1.entry2
)


但是,对于条目数量可变的情况,有没有办法做到这一点呢?

b1zrtrql

b1zrtrql1#

如果你想把字段从一个类Map到另一个类来帮助数据传输,那么动态地这样做是一个坏主意。
相反,一个更好的选择是在类上创建一个方法,让它决定如何转换为另一种类型。(这是一个Java代码的例子,我不是很精通Kotlin)

public <T> T convertTo(Class<T> clazz) {
    if (String.class.equals(clazz)) return this.toString(); // example conversion
    throw new IllegalArgumentException("Cannot convert to "+clazz);

}

字符串

hxzsmxv2

hxzsmxv22#

我同意@0x150和@broot关于这种系统设计的脆弱性的警告。
我假设dc 1不是你的,dc 2在你的控制之内。
在评论中,你有没有发现@broot提到了扩展函数。这些函数的神奇之处在于你可以将它们应用到你无法控制的类(比如dc 1)。
我也喜欢broot的mapstruct的建议,但是如果想要另一种解决方案,它是一种反射,但是通过序列化。
1.选择Object <> JSON序列化库,例如Jackson
1.将您无法控制的类(dc1)序列化为JSON(或Node map)
1.现在确定哪个是目标类。您不清楚这是否是众所周知的,例如dc2,或者这是否是问题的一部分。如果您需要进行匹配,那么也许您可以使用JSON中的键集来完成此操作
1.然后,通过将JSON格式化来创建dc2的示例,之前已使用@JsonIgnoreProperties(ignoreUnknown = true)或序列化库的等效项注解了dc2
这工程

import com.fasterxml.jackson.annotation.JsonIgnoreProperties
import com.fasterxml.jackson.databind.json.JsonMapper
import com.fasterxml.jackson.module.kotlin.KotlinFeature
import com.fasterxml.jackson.module.kotlin.KotlinModule
import io.kotest.matchers.shouldBe
import org.junit.jupiter.api.Test

class  T {
    data class DataClass1(
        val entry0: Any,
        val entry1: Any,
        val entryN: Any
    )

    @JsonIgnoreProperties(ignoreUnknown = true)
    data class DataClass2(
        val entry1: Any,
        val entryN: Any
    )

    val mapper = JsonMapper.builder()
        .addModule(KotlinModule.Builder().configure(KotlinFeature.StrictNullChecks, true).build())
        .build()
    fun convert(dc1: DataClass1): DataClass2 = mapper.readValue(mapper.writeValueAsString(dc1), DataClass2::class.java)

    @Test
    fun convertTest() {
        val dc1: DataClass1 = DataClass1(44, 55, 66)
        val dc2: DataClass2 = convert(dc1)
        dc2 shouldBe DataClass2(55, 66)
    }
}

字符串

相关问题