【问题标题】:Map an object that having list inside to another object with the list将具有列表的对象映射到具有列表的另一个对象
【发布时间】:2021-08-19 09:22:07
【问题描述】:

我正在尝试将 object1 映射到另一个 object2。但 object1 中有一个列表。 这是我的代码。但是当我收到错误消息时说不能投。 这是我从 API 获得的对象

    interface  Api {


    @GET("/api/")
    fun getUsers(@Query("results") results: Int): Single<Dto.Users>


    sealed class Dto {
        data class Users(
            @SerializedName("results") var resultDto: List<Result>
        ) : Dto()

        data class Result(
            var cell: String,
            var email: String,
            var gender: String,
            var name: Name,
            var nat: String,
            var phone: String
        ) : Dto()

        data class Name(
            var first: String,
            var last: String,
            var title: String
        ) : Dto()


    }

}

另一个要映射的数据类。

sealed class Entity {

    data class Users(
        val results: List<Result>
    ) : Entity()


    data class Result(
        var cell: String,
        var email: String,
        var gender: String,
        var name: Name,
        var nat: String,
        var phone: String
    ) : Entity()

    data class Name(
        var first: String,
        var last: String,
        var title: String
    ) : Entity()


}

这是我用来将 dto 转换为实体的扩展函数。

    Api.Dto.Users.map() = Entity.Users(
    resultDto.map { result ->
        Entity.Result(
            result.cell,
            result.email,
            result.gender,
            Entity.Name(result.name.first, result.name.last, result.name.title),
            result.nat,
            result.phone
        )
    }
)

以及我如何使用扩展函数将 dto 转换为实体。

  val data = dataFromServer.applyIoScheduler().map { userObj -> { userObj.map() } }

【问题讨论】:

  • 显示EntityDto 类的代码
  • 不清楚您要达到的目标。为相同添加一些更多信息。这个干净的架构是你想要实现的吗?
  • @mightyWOZ 更新了类的代码。
  • @KARUNESHPALEKAR 是的,我正在学习干净的架构,问题是,我得到了 DTO 类的响应,但后来我想将 DTO 对象转换为实体对象。

标签: kotlin rx-android


【解决方案1】:

我尝试设置您的示例。如前所述,您错过了ApiDtoEntity。但是在添加它们之后,我得到了一个工作示例(可以编译)。因为类名相等,所以不好理解。也许您也为此苦苦挣扎并链接了错误的类型?这是你的本意吗?:

open class Entity {
    data class Users(
        var resultDto: List<Entity.Result>
    ) : Dto()

    data class Result(
        var cell: String,
        var email: String,
        var gender: String,
        var name: Entity.Name,
        var nat: String,
        var phone: String
    ) : Dto()

    data class Name(
        var first: String,
        var last: String,
        var title: String
    ) : Dto()
}

open class Dto {

    data class Users(
        val results: List<Dto.Result>
    ) : Entity()


    data class Result(
        var cell: String,
        var email: String,
        var gender: String,
        var name: Dto.Name,
        var nat: String,
        var phone: String
    ) : Entity()

    data class Name(
        var first: String,
        var last: String,
        var title: String
    ) : Entity()
}

fun Dto.Result.map(): Entity.Users {
    return Entity.Users(
        listOf(this).map { result ->
            Entity.Result(
                result.cell,
                result.email,
                result.gender,
                Entity.Name(result.name.first, result.name.last, result.name.title),
                result.nat,
                result.phone
            )
        })
}

【讨论】:

  • 感谢您的帮助,但我不知道如何使用您的功能。你能为此写一个扩展方法吗?
  • 我更改为将方法映射到扩展并跳过局部变量。这使得代码更简洁,但可能会激怒不熟悉Kotlin Extensions的人。
猜你喜欢
  • 2017-03-06
  • 2018-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
相关资源
最近更新 更多