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

Kotlin中如何等待任务完成?大数据过滤代码优化咨询

问题描述

我有如下处理API响应的函数:

internal fun handleResponse(items: List<TestItem>? = null) {
    viewModelScope.launch(Dispatchers.IO) {
        val isDataReturned = testItems != null // 此处存在笔误,应为items != null
        if (isDataReturned) {
            dataModelList = getfilterDataList(items).toMutableStateList()
        }
        requestCompleteLiveData.postValue(isDataReturned)
    }
}

场景说明:通过API调用接收数据,数据可能为空,收到后传入handleResponse做过滤处理,其中getfilterDataList()是处理超1000条数据及子项的重过滤方法,定义如下:

fun getfilterDataList(unfilteredList: List<TestItem>): MutableList<DataModel> {
        return unfilteredList
            .asSequence()
            .mapNotNull { it.testData }
            .filterNot { isInvalidTestData(it) }
            .mapIndexed { index, testData ->
                // 内部包含更多数据转换逻辑
              DataModel()
            }.toMutableList()
}

现有dataModelList定义:

var dataModelList = mutableStateListOf<DataModel>()

需要优化代码满足以下要求:

  • 若未返回数据(isDataReturned为false),直接发送LiveData通知请求完成;
  • 若返回数据(isDataReturned为true),必须等待dataModelList完成所有数据收集后,再发送LiveData通知。
优化后的实现方案

修正笔误+逻辑优化后的代码

internal fun handleResponse(items: List<TestItem>? = null) {
    viewModelScope.launch(Dispatchers.IO) {
        // 空数据直接分支处理,立即发送通知并结束协程
        items ?: run {
            requestCompleteLiveData.postValue(false)
            return@launch
        }

        // 数据非空时,先完成所有过滤与数据收集
        dataModelList = getfilterDataList(items).toMutableStateList()
        // 确保数据赋值完成后再发送请求完成通知
        requestCompleteLiveData.postValue(true)
    }
}

关键优化点说明

  1. 提前拦截空值逻辑:用?: run直接处理空数据场景,减少嵌套分支,逻辑更简洁,避免后续不必要的代码执行;
  2. 保证数据就绪再通知:数据非空时,先完整执行getfilterDataList的过滤转换逻辑,将结果赋值给dataModelList后,再发送LiveData,确保UI收到通知时dataModelList已经准备好全部数据;
  3. 修正原始代码笔误:将testItems != null改为items != null,匹配函数入参,避免空指针或逻辑错误。

额外优化建议

如果getfilterDataList处理超大量数据时确实耗时,可以进一步优化集合转换步骤:直接在序列操作末尾生成MutableStateList,减少一次集合拷贝:

fun getfilterDataList(unfilteredList: List<TestItem>): MutableStateList<DataModel> {
        return unfilteredList
            .asSequence()
            .mapNotNull { it.testData }
            .filterNot { isInvalidTestData(it) }
            .mapIndexed { index, testData ->
                // 内部包含更多数据转换逻辑
              DataModel()
            }.toMutableStateList()
}

此时handleResponse中可直接写dataModelList = getfilterDataList(items),省略额外的toMutableStateList()调用。

内容的提问来源于stack exchange,提问作者Compose Learner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 02:40:10