Kotlin 如何将DataModel类映射到DomainModel类?

Kotlin 如何将DataModel类映射到DomainModel类?,kotlin,Kotlin,我正在创建DataModel和DomainModel类,以避免代码中的空检查。 如何映射嵌套类? 我可以给出什么默认值 MyDataModel.kt(没有太多关于API的信息,所以我需要假设所有值都可以为null) 数据类MyDataModel( @序列化名称(“id”) val id:Int?, @SerializedName(“显示时间”) val timeToShow:Int?, @序列化名称(“作者”) 作者:作者?, @序列化名称(“问题”) 问:问题?, @序列化名称(“答案”) 答

我正在创建DataModel和DomainModel类,以避免代码中的空检查。 如何映射嵌套类? 我可以给出什么默认值

MyDataModel.kt(没有太多关于API的信息,所以我需要假设所有值都可以为null)

数据类MyDataModel(
@序列化名称(“id”)
val id:Int?,
@SerializedName(“显示时间”)
val timeToShow:Int?,
@序列化名称(“作者”)
作者:作者?,
@序列化名称(“问题”)
问:问题?,
@序列化名称(“答案”)
答案:列表?
) {
数据类作者(
@SerializedName(“名字”)
val firstName:字符串?,
@SerializedName(“姓氏”)
val lastName:字符串?,
@序列化名称(“图像”)
val图像:字符串?
)
数据类问题(
@序列化名称(“id”)
val id:长?,
@序列化名称(“标题”)
val标题:字符串?
)
数据类答案(
@序列化名称(“id”)
val id:长?,
@序列化名称(“标题”)
val标题:字符串?,
@序列化名称(“图像”)
val answerImage:answerImage?
) {
数据类应答器映像(
@序列化名称(“0”)
val x0:回答ImageData?
) {
数据类应答ImageData(
@序列化名称(“id”)
val id:字符串?,
@序列化名称(“url”)
val url:String?
)
}
}
}
MyDomainModel.kt(稍后我将需要创建一个函数来检查此类上的所有属性是否有效)

数据类MyDomainModel(
val id:Int,
val timeToShow:Int,
作者:作者,
问题:问题,,
val答案:列表
) {
数据类作者(
val firstName:String,
val lastName:String,
val图像:字符串
)
数据类问题(
val id:Long,
val标题:字符串
)
数据类答案(
val id:Long,
val标题:字符串,
val-imageUrl:String?
)
}
映射器类

interface Mapper<F,S> {
    fun dataToDomainModel(dataModel: F): S
    fun domainToDataModel(domainModel: S): F
}


class DataToDomainMapper: Mapper<MyDataModel, MyDomainModel> {
    override fun dataToDomainModel(first: MyDataModel): MyDomainModel {
        return MyDomainModel(
            id = first.id ?: -1,
            title = first.title ?: "",
            question = ??????
        )
    }

    override fun domainToDataModel(second: MyDomainModel): MyDataModel {
        return MyDataModel(
            id = second.id,
            title = second.title,
            ...
        )
    }
}
接口映射器{
有趣的dataToDomainModel(dataModel:F):S
趣味领域模型(领域模型:S):F
}
类DataToDomainMapper:Mapper{
覆盖有趣的dataToDomainModel(第一个:MyDataModel):MyDomainModel{
返回MyDomainModel(
id=first.id?:-1,
title=first.title?:“”,
问题=??????
)
}
覆盖有趣的域模型(第二个:MyDomainModel):MyDataModel{
返回MyDataModel(
id=second.id,
title=second.title,
...
)
}
}

您不需要嵌套类。推出课程:

data class MyDataModel(
    @SerializedName("id")
    val id: Int?,
    @SerializedName("time_to_show")
    val timeToShow: Int?,
    @SerializedName("author")
    val author: Author?,
    @SerializedName("question")
    val question: Question?,
    @SerializedName("answers")
    val answers: List<Answer>?
) 

data class Author(
        @SerializedName("first_name")
        val firstName: String?,
        @SerializedName("last_name")
        val lastName: String?,
        @SerializedName("image")
        val image: String?
    )

data class Question(
        @SerializedName("id")
        val id: Long?,
        @SerializedName("title")
        val title: String?
    )

data class Answer(
        @SerializedName("id")
        val id: Long?,
        @SerializedName("title")
        val title: String?,
        @SerializedName("image")
        val answerImage: AnswerImage?
    )

data class AnswerImage(
            @SerializedName("0")
            val x0: AnswerImageData?
        )

data class AnswerImageData(
                @SerializedName("id")
                val id: String?,
                @SerializedName("url")
                val url: String?
            )
数据类MyDataModel(
@序列化名称(“id”)
val id:Int?,
@SerializedName(“显示时间”)
val timeToShow:Int?,
@序列化名称(“作者”)
作者:作者?,
@序列化名称(“问题”)
问:问题?,
@序列化名称(“答案”)
答案:列表?
) 
数据类作者(
@SerializedName(“名字”)
val firstName:字符串?,
@SerializedName(“姓氏”)
val lastName:字符串?,
@序列化名称(“图像”)
val图像:字符串?
)
数据类问题(
@序列化名称(“id”)
val id:长?,
@序列化名称(“标题”)
val标题:字符串?
)
数据类答案(
@序列化名称(“id”)
val id:长?,
@序列化名称(“标题”)
val标题:字符串?,
@序列化名称(“图像”)
val answerImage:answerImage?
)
数据类应答器映像(
@序列化名称(“0”)
val x0:回答ImageData?
)
数据类应答ImageData(
@序列化名称(“id”)
val id:字符串?,
@序列化名称(“url”)
val url:String?
)
然后,您需要为这些类中的每一个都有一个域模型,并为每个类实现一个映射器。然后使用所需的映射器映射较大类的属性(我所说的较大类是指具有另一个类作为属性的类)

您的最终代码应该如下所示(构造函数中有更多映射器):

类DataToDomainMapper(val问题映射器:问题映射器):映射器{
覆盖有趣的dataToDomainModel(第一个:MyDataModel):MyDomainModel{
返回MyDomainModel(
id=first.id?:-1,
title=first.title?:“”,
question=questionMapper.firstToSecond(first.question)
)
}
覆盖有趣的域模型(第二个:MyDomainModel):MyDataModel{
返回MyDataModel(
id=second.id,
title=second.title,
...
)
}
}
您需要在
QuestionMapper

interface Mapper<F,S> {
    fun dataToDomainModel(dataModel: F): S
    fun domainToDataModel(domainModel: S): F
}


class DataToDomainMapper: Mapper<MyDataModel, MyDomainModel> {
    override fun dataToDomainModel(first: MyDataModel): MyDomainModel {
        return MyDomainModel(
            id = first.id ?: -1,
            title = first.title ?: "",
            question = ??????
        )
    }

    override fun domainToDataModel(second: MyDomainModel): MyDataModel {
        return MyDataModel(
            id = second.id,
            title = second.title,
            ...
        )
    }
}
data class MyDataModel(
    @SerializedName("id")
    val id: Int?,
    @SerializedName("time_to_show")
    val timeToShow: Int?,
    @SerializedName("author")
    val author: Author?,
    @SerializedName("question")
    val question: Question?,
    @SerializedName("answers")
    val answers: List<Answer>?
) 

data class Author(
        @SerializedName("first_name")
        val firstName: String?,
        @SerializedName("last_name")
        val lastName: String?,
        @SerializedName("image")
        val image: String?
    )

data class Question(
        @SerializedName("id")
        val id: Long?,
        @SerializedName("title")
        val title: String?
    )

data class Answer(
        @SerializedName("id")
        val id: Long?,
        @SerializedName("title")
        val title: String?,
        @SerializedName("image")
        val answerImage: AnswerImage?
    )

data class AnswerImage(
            @SerializedName("0")
            val x0: AnswerImageData?
        )

data class AnswerImageData(
                @SerializedName("id")
                val id: String?,
                @SerializedName("url")
                val url: String?
            )
class DataToDomainMapper(val questionMapper: QuestionMapper): Mapper<MyDataModel, MyDomainModel> {
    override fun dataToDomainModel(first: MyDataModel): MyDomainModel {
        return MyDomainModel(
            id = first.id ?: -1,
            title = first.title ?: "",
            question = questionMapper.firstToSecond(first.question)
        )
    }

    override fun domainToDataModel(second: MyDomainModel): MyDataModel {
        return MyDataModel(
            id = second.id,
            title = second.title,
            ...
        )
    }
}