如何在Kotlin扩展函数中返回正确的ApiUpdateDeviceList类型
问题分析与解决方案
核心问题
你的代码存在两个关键错误:
- 扩展函数逻辑错位:
DbEquipmentWithMediaList的扩展函数应该处理当前实例的转换,但你却在遍历外部的dbFields列表,逻辑完全不符。 - forEach的误用:
forEach是无返回值的遍历函数,不能将其赋值给ApiUpdateDeviceList类型变量,且返回类型与函数声明的单个对象不匹配。
解决方案分两种场景
场景1:单个DbEquipmentWithMediaList转成单个ApiUpdateDeviceList
这符合你定义的扩展函数语义,直接基于当前实例转换:
fun DbEquipmentWithMediaList.toApiUpdateDeviceList(): ApiUpdateDeviceList { return ApiUpdateDeviceList( deviceEquipmentId = this.sSEquipmentDbInfo.deviceEquipmentId, secondaryDeviceId = this.sSEquipmentDbInfo.secondaryDeviceId, deviceInstanceId = this.sSEquipmentDbInfo.deviceInstanceId?.toString(), // 空值处理避免NPE deviceSerialNumber = this.sSEquipmentDbInfo.deviceSerialNumber, devicePartNumber = this.sSEquipmentDbInfo.devicePartNumber, deviceManufacturerName = this.sSEquipmentDbInfo.deviceManufacturer, deviceInstallationDate = DateUtil.dateToStringUTCSiteSurvey(this.sSEquipmentDbInfo.deviceInstallationDate), deviceLocation = this.sSEquipmentDbInfo.locationInfo, deviceTechnicianNotes = this.sSEquipmentDbInfo.deviceTechnicianNotes ) }
场景2:List<DbEquipmentWithMediaList>转成List<ApiUpdateDeviceList>
如果实际需求是把整个设备列表转换为API所需的列表,给列表写扩展函数:
fun List<DbEquipmentWithMediaList>.toApiUpdateDeviceList(): List<ApiUpdateDeviceList> { return this.map { dbItem -> ApiUpdateDeviceList( deviceEquipmentId = dbItem.sSEquipmentDbInfo.deviceEquipmentId, secondaryDeviceId = dbItem.sSEquipmentDbInfo.secondaryDeviceId, deviceInstanceId = dbItem.sSEquipmentDbInfo.deviceInstanceId?.toString(), deviceSerialNumber = dbItem.sSEquipmentDbInfo.deviceSerialNumber, devicePartNumber = dbItem.sSEquipmentDbInfo.devicePartNumber, deviceManufacturerName = dbItem.sSEquipmentDbInfo.deviceManufacturer, deviceInstallationDate = DateUtil.dateToStringUTCSiteSurvey(dbItem.sSEquipmentDbInfo.deviceInstallationDate), deviceLocation = dbItem.sSEquipmentDbInfo.locationInfo, deviceTechnicianNotes = dbItem.sSEquipmentDbInfo.deviceTechnicianNotes ) } }
用
map函数遍历列表,将每个数据库实体转换为API实体,最终返回转换后的列表。
调用示例
- 单个转换:
singleDbItem.toApiUpdateDeviceList() - 列表转换:
dbFields.toApiUpdateDeviceList()
内容的提问来源于stack exchange,提问作者OEThe11
相关产品推荐
相关产品推荐

