使用.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
相关产品推荐
相关产品推荐

