Kotlin对象转换为其他对象的方式

5

http://cm08323.tmweb.ru/android/determinace/json/images.json

我向服务器发送了一些 json 数据。

我的数据库类:

@Entity
data class Image(val url: String = "", val urlAnswer: String = "", val race: String = "") : DisplayableItem, Persistable

API接口:

interface ImagesAdi {
    @GET("android/determinace/json/images.json")
    fun getImages(): Single<List<ImagesResponse>>
}
...
class ImagesResponse(
        val images: List<ImageSingle>)

class ImageSingle(val url: String,
            val url_answer: String,
            val race: String)

我为将ImagesResponse转换为Image编写的映射器:

@Singleton
class ChooseRaceMapper @Inject constructor() : (ImageSingle) -> Image {
    override fun invoke(response: ImageSingle): Image = Image(response.url, response.url_answer, response.race)
}

如何将 List<ImageSingle> 转换成 List<Image> ?这里是转换器的示例:

我有一个用于单个对象的转换器,它看起来像这样:

fun chooseRace(): Single<Image> = imagesAdi.getSingleImage()
        .map { chooseRaceMapper.invoke(it) }
        .doOnSuccess {
            database.addDetectedResult(it)
                    .subscribeIgnoreResult()

            requestImages()
        }

你能帮我编写类型为"List"的转换器吗?我尝试着去做,但是没有成功。谢谢。抱歉我的英语不太好。

或者在Mapper类中进行从List到List的转换会更好吗?(在invoke方法中)


你有一组图片,但你只需要其中的一张。我猜你只需要在列表中选择一个。你想要哪一个? - marstran
@marstran 我需要将对象从List<ImageSingle>转换为List<Image>,而函数chooseRace返回类型为Single<List<Image>>的列表。 - Tipok
2个回答

2
考虑到你的images.json文件,你的getImages()函数不应该返回一个ListSingle
@GET("android/determinace/json/images.json")
fun getImages(): Single<ImagesResponse>

那么您可以使用 Kotlin 的 List.map() 映射器来映射该列表。
imagesAdi.getImages()
    .map { list -> list.map { chooseRaceMapper.invoke(it) } }
    .doOnSuccess { }

1
接口声明错误:

interface ImagesAdi {
    @GET("android/determinace/json/images.json")
    fun getImages(): Single<List<ImagesResponse>>
}

它应该是这样的(根据您的JSON):
interface ImagesAdi {
    @GET("android/determinace/json/images.json")
    fun getImages(): Single<ImagesResponse>
}

对于映射部分,类似这样的内容就可以了:
imagesAdi.getImages().map { it.images }
    .map { /* your mapper here */ }
    ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接