Сопоставьте объект, у которого есть список внутри, с другим объектом со списком

#kotlin #rx-android

Вопрос:

Я пытаюсь сопоставить объект 1 с другим объектом2. но в объекте 1 есть список. Это мой код. но когда, но я получаю ошибку, говоря, что нельзя использовать. Это объект, который я получаю из 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() } }
 

Комментарии:

1. Покажите код для Entity Dto классов и

2. Непонятно, чего вы пытаетесь достичь . Добавьте еще немного информации для того же самого . Является ли эта чистая архитектура тем, чего вы пытаетесь достичь ?

3. @mightyWOZ обновил код классов.

4. @KARUNESHPALEKAR Да, я изучаю чистую архитектуру, Проблема в том, что я получаю ответ как класс DTO, но позже я хочу преобразовать объект DTO в объект сущности.

Ответ №1:

Я попытался привести ваш пример. Как уже упоминалось, вы пропустили Api , Dto , Entity . Но после их добавления я получил рабочий пример (могу скомпилировать). Из-за одинакового названия класса его нелегко понять. Может быть, вы тоже боролись с этим и связывали неправильные типы? Это было вашим намерением?:

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

Комментарии:

1. Спасибо за вашу помощь, но я не уверен, как использовать вашу функцию. не могли бы вы написать для этого метод расширения?

2. Я изменил метод сопоставления на расширение и пропустил локальные переменные. Это делает код более лаконичным, но может раздражать людей, которые не знакомы с расширениями Kotlin .