所以我已经处理这个问题好几天了.我有一个用于将信息发送回API的数据类.在本例中,我有x个域.在这些字段中,有三个不同类型的列表字段.

数据类

data class ApiSurveySiteUpdateBody(
        @SerializedName("UserId") val userId: Int,
        @SerializedName("SStatusId") val sStatusId: Int,
        @SerializedName("SSId") val sSId: Int,
        @SerializedName("SPONum") val sPoNum: Int,
        @SerializedName("WorkPerformanceTypeId") val workPerformTypeId: Int,
        @SerializedName("SSAddressId") val sSAddressId: Int,
        @SerializedName("WorktoPerformDate") val workToBePerformedDate: String,
        @SerializedName("CableRun") val cableRun: String,
        @SerializedName("Entrance") val entranceInfo: String,
        @SerializedName("DoorLockHardware") val doorLockHardware: String,
        @SerializedName("HandicapOperator") val handicapOperator: String,
        @SerializedName("DeviceComplete") val completedPrimaryDeviceList: List<Int>,
        @SerializedName("TemplateId") val templateId: Int,
        @SerializedName("NewDeviceList") val newDeviceList: List<ApiNewDeviceList> = emptyList(),
        @SerializedName("UpdateDeviceList") val updateDeviceList: List<ApiUpdateDeviceList> = emptyList(),
        @SerializedName("RemoveDeviceList") val removedDeviceList: List<ApiRemovedDeviceList> = emptyList()
)

转换器功能

 private fun getSomeRequestBody(
            dbInfo: DbFormWithEList,
            apiSurveySiteMedias: List<ApiSSMediaInfo>
        )
                : ApiSSUpdateBody {
            val updateRequestApi = ApiSSUpdateBody(
                userId = dbInfo.sSDbInfo.userId,
                sSId = dbInfo.sSDbInfo.sSId,
                sStatusId = dbInfo.sStatusDbInfo.sSId,
                sPoNum = dbInfo.sSDbInfo.sPoNumber,
                workPerformTypeId = dbInfo.sSDbInfo.workPerformTypeId,
                sSAddressId = dbInfo.sSDbInfo.sSAddressId,
                workToBePerformedDate = dbInfo.sSDbInfo.workToBePerformedDate,
                cableRun = dbInfo.sSDbInfo.cableRun,
                entranceInfo = dbInfo.sSDbInfo.entranceInfo,
                doorLockHardware = dbInfo.sSDbInfo.doorLockHardware,
                handicapOperator = dbInfo.sSDbInfo.handicapOperator,
                completedPrimaryDeviceList = dbInfo.sSDbInfo.completedPrimaryDeviceList.toIntList(),
                templateId = dbInfo.sSDbInfo.templateId,
                newDeviceList = List(dbInfo.equipmentList.size) { i -> // “NewDeviceList”
                    val dbEquipmentInfo = dbInfo.equipmentList[i].sSEquipmentDbInfo
                    Log.d(TAG, "NewDeviceListDB $dbEquipmentInfo")
                    val secondaryDeviceCheckedStatus = dbEquipmentInfo.secondaryDeviceCheckedStatus
                    val isDuplicateDeviceInUpdatePhase = dbEquipmentInfo.isDeviceUpdateMode
                    
                    if (sDeviceCheckedS == CHECKED_YES && !isDuplicateDUP){
                        val newDeviceListRequestBody =  ApiNewDeviceList(
                            secondaryDeviceId = dbEquipmentInfo.secondaryDeviceId,
                            deviceInstanceId = dbEquipmentInfo.deviceInstanceId.toString(),
                            mediaNameList = dbEquipmentInfo.mediaNames,
                            deviceSerialNumber = dbEquipmentInfo.deviceSerialNumber,
                            devicePartNumber = dbEquipmentInfo.devicePartNumber,
                            deviceManufacturerName = dbEquipmentInfo.deviceManufacturer,
                            deviceInstallationDate = DateUtil.dateToStringUTCSS(dbEquipmentInfo.deviceInstallationDate),
                            deviceLocation = dbEquipmentInfo.locationInfo,
                            deviceTechnicianNotes = dbEquipmentInfo.deviceTechnicianNotes
                        )
                        Log.d(TAG, "newDeviceListRequestBodyAPI $newDeviceListRequestBody")
                        newDeviceListRequestBody
                    }
                    else if (sDeviceCheckedS == CHECKED_NO){
                        apiDeviceListMapperUpdateSS.sendDeviceNotExistsInNewDeviceList(dbEquipmentInfo)
                    }
                    else {
                        apiDeviceListMapperUpdateSS.sendEmptyNewDeviceList()
                    }
                },

                updateDeviceList = (List(dbInfo.equipmentList.size) { i ->
                    val dbEquipmentInfo = dbInfo.equipmentList[i].sSEquipmentDbInfo
                    Log.d("UpdatingSiteSurvey", "UpdateDeviceListDB $dbEquipmentInfo")
                    val secondaryDeviceCheckedStatus = dbEquipmentInfo.secondaryDeviceCheckedStatus
                    val isDuplicateDeviceInUpdatePhase = dbEquipmentInfo.isDeviceUpdateMode
                     if (secondaryDeviceCheckedStatus == CHECKED_YES && isDuplicateDeviceInUpdatePhase){
                        val updateDeviceListRequestBody =  ApiUpdateDeviceList(
                                deviceEquipmentId = dbEquipmentInfo.deviceEquipmentId,
                                secondaryDeviceId = dbEquipmentInfo.secondaryDeviceId,
                                deviceInstanceId = dbEquipmentInfo.deviceInstanceId.toString(),
                                deviceSerialNumber = dbEquipmentInfo.deviceSerialNumber,
                                devicePartNumber = dbEquipmentInfo.devicePartNumber,
                                deviceManufacturerName = dbEquipmentInfo.deviceManufacturer,
                                deviceInstallationDate = DateUtil.dateToStringUTCSiteSurvey(dbEquipmentInfo.deviceInstallationDate),
                                deviceLocation = dbEquipmentInfo.locationInfo,
                                deviceTechnicianNotes = dbEquipmentInfo.deviceTechnicianNotes
                        )
                        Log.d(TAG, "updateDeviceListRequestBodyAPI $updateDeviceListRequestBody")
                        updateDeviceListRequestBody
                    } else Unit.apply {  } //<- the issue is here 
    
                }) as List<ApiUpdateDeviceList>,
                removedDeviceList = List(dbInfo.sSDbInfo.removedDeviceList.size) { i ->
                    val dbRemovedMediaItem = dbInfo.sSDbInfo.removedDeviceList[i]
                    Log.d(TAG, "RemovedListDB $dbRemovedMediaItem")
                   
    

                    if (dbRemovedMediaItem.removedDeviceEquipmentId == null && dbRemovedMediaItem.removedMediaName.isNullOrEmpty()){
                       val removeDevice =  apiDeviceListMapperUpdateSiteSurvey.removeDevice(dbRemovedMediaItem)
                        Log.d(TAG, "removeDevice $removeDevice")
                        removeDevice
                    }else{
                        val removeMediaForExistingDevice = apiDeviceListMapperUpdateSS.removeMediaForExistingDevice(dbRemovedMediaItem)
                        Log.d(TAG, "removeMediaForExistingDevice $removeMediaForExistingDevice")
                        removeMediaForExistingDevice
                    }
                }
            )
            Log.d(TAG, "MainUpdateRequestAPI $updateRequestApi")
            return updateRequestApi
        }

其目标是突出显示Else语句,以向该updateDeviceList字段返回一个空的列表"[]".我try 了几种方法,但始终无法返回确切的空列表"[]".任何帮助都将不胜感激.谢谢.

推荐答案

我不知道您是希望(1)如果迭代中有任何项未通过if判断,则使整个列表无效并变为空,还是希望(2)筛选出未通过IF判断的项.但以下是我如何处理每一项任务的方法.

我将DbEquipmentInfoApiUpdateDeviceList之间的转换分解为一个单独的扩展函数(fun DbEquipmentInfo.toApiUpdateDeviceList(): ApiUpdateDeviceList).不仅是为了避免代码重复,也是为了使逻辑代码易于阅读,并使项目代码总体上更易于维护.

1.

val isValid = dbInfo.equipmentList.all { dbEquipmentInfo -> 
        val secondaryDeviceCheckedStatus = dbEquipmentInfo.secondaryDeviceCheckedStatus
        val isDuplicateDeviceInUpdatePhase = dbEquipmentInfo.isDeviceUpdateMode
        secondaryDeviceCheckedStatus == CHECKED_YES && isDuplicateDeviceInUpdatePhase
    }
updateDeviceList = 
    if (isValid) dbInfo.equipmentList.map { it.toApiUpdateDeviceList() }
    else emptyList()
updateDeviceList = dbInfo.equipmentList.filter { dbEquipmentInfo -> 
        val secondaryDeviceCheckedStatus = dbEquipmentInfo.secondaryDeviceCheckedStatus
        val isDuplicateDeviceInUpdatePhase = dbEquipmentInfo.isDeviceUpdateMode
        secondaryDeviceCheckedStatus == CHECKED_YES && isDuplicateDeviceInUpdatePhase
    }.map { it.toApiUpdateDeviceList() }

Json相关问答推荐

PostgreSQL 12.17从JSON数组提取元素

JOLT将对象名作为新属性添加到主体中

使用单元和非单元版本反序列化Rust中的枚举,而无需编写自定义反序列化程序

将JSON数组组织到菜单中

导致此 Kotlin Retrofit2 错误的可能原因有哪些?

将JSON行转换为TSV格式, for each 数组项生成单独的行

使用 Groovy 将 XML 转换为 JSON

JSONPath:查找子项目条件在字符串列表中的项目

阅读 JSON 正文 Firebase 云函数

shell解析json并循环输出组合变量

将文本转换为 python 列表

jq搜索特定字符串并输出对应的父值

如何将西里尔字母转换为 utf16

Jolt - 在同一级别添加时组合值的问题

避免 KeyError 的默认字典键

可以通过 POST 使用 EventSource 传递参数的服务器发送事件 (SSE)

Json.NET 是否缓存类型的序列化信息?

MVC JsonResult camelCase 序列化

如何在dart Flutter 中将json字符串转换为json对象?

春天:返回@ResponseBodyResponseEntity>