You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用.map转换Network对象至Domain对象时遇未解析引用问题

问题描述

尝试在接口返回的PlayersNetworkModel(网络层模型)上使用.map方法转换为PlayersDomainModel(领域层模型),但编译器提示.map是未解析引用。

代码示例

suspend fun getAllPlayersFromNetwork(): PlayersDomainModel {
    val response: PlayersNetworkModel = api.getAllPlayers()
    return response.map { it.toDomain() }
}

网络层数据类

data class PlayersNetworkModel(

    @SerializedName("data") var data: MutableList<DataNetworkModel> = mutableListOf(),
    @SerializedName("meta") var meta: MetaNetworkModel? = MetaNetworkModel()

){
    constructor() : this(mutableListOf(), MetaNetworkModel())
}

领域层数据类

data class PlayersDomainModel(

    var data: MutableList<DataDomainModel> = mutableListOf(),
    var meta: MetaDomainModel? = MetaDomainModel()

)

转换方法

fun PlayersNetworkModel.toDomain(): PlayersDomainModel {
    val mapMeta : MetaDomainModel
    meta.let {
        mapMeta = MetaDomainModel(meta?.totalPages, meta?.currentPage, meta?.nextPage, meta?.perPage, meta?.totalCount)
    }

    val mapData : MutableList<DataDomainModel> = mutableListOf()
    data.let {
        for(item in data){
            val mapTeam : TeamDomainModel = TeamDomainModel(item.team?.id, item.team?.abbreviation, item.team?.city, item.team?.conference, item.team?.division, item.team?.fullName, item.team?.name)
            mapData.add(DataDomainModel(item.id, item.firstName, item.heightFeet, item.heightInches, item.lastName, item.position, mapTeam, item.weightPounds))
        }
    }

    return PlayersDomainModel(mapData, mapMeta)
}

问题原因与解决方案

核心问题

.map是Kotlin集合(如List、MutableList)的专属扩展函数,仅能作用于集合类型。而PlayersNetworkModel是自定义的数据类,并非集合,所以不存在map方法,编译器因此报错。

修正代码

你已经为PlayersNetworkModel实现了toDomain()扩展函数,直接调用该函数即可完成模型转换:

suspend fun getAllPlayersFromNetwork(): PlayersDomainModel {
    val response: PlayersNetworkModel = api.getAllPlayers()
    return response.toDomain() // 直接调用已实现的转换方法
}

额外优化建议

可以用更简洁的Kotlin语法重构toDomain()函数,简化空值处理和集合转换逻辑:

fun PlayersNetworkModel.toDomain(): PlayersDomainModel {
    val mapMeta = meta?.let { 
        MetaDomainModel(it.totalPages, it.currentPage, it.nextPage, it.perPage, it.totalCount)
    } ?: MetaDomainModel()

    val mapData = data.map { item ->
        val mapTeam = item.team?.let {
            TeamDomainModel(it.id, it.abbreviation, it.city, it.conference, it.division, it.fullName, it.name)
        } ?: TeamDomainModel() // 根据实际业务需求处理team为null的情况
        DataDomainModel(item.id, item.firstName, item.heightFeet, item.heightInches, item.lastName, item.position, mapTeam, item.weightPounds)
    }.toMutableList()

    return PlayersDomainModel(mapData, mapMeta)
}

内容的提问来源于stack exchange,提问作者Víctor Martín

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 07:25:35