android - Kotlin:如何使用嵌套列表映射列表

标签 android performance kotlin datamapper

我想在 Kotlin 中将网络 DTO(rest api 响应)转换为数据库 DTO。 Network DTO 包含一个 List as 字段,该列表中的项目还包含其他数据的列表。下面是网络响应或网络DTO的表示

{
   categories: [
      {
         catId: 0,
         name: "Category A",
         products: [
             {
                 prodId: 900,
                 name: "Product 1"
                 ingredients: [
                     {
                         name: "Ingre 1"
                     }
                 ]
             }
         ]
      }
   ]
}

我想将所有类别的列表、所有产品的列表和所有成分的列表提取并转换为三个单独的列表,并且还想将这些数据转换为它们各自的数据库 DTO。

我已经创建了一段代码来完成所需的任务,但我确信存在性能问题并且必须有更多的 kotlinish 解决方案。

val dbCategories = networkCategories?.map {
                    DBCategory(
                            catId = it.catId,
                            name = it.name
                    )
                }

val dbProducts = networkCategories?.map { it.networkProducts }?.map {
                it.map { singleNetworkProduct ->
                    DBProduct(
                            prodId = singleNetworkProduct.prodId,
                            name = singleNetworkProduct.name,
                    )
                }
            }?.flatten() // flatten to remove the nested array lists created by repeated map functions

在上面的代码中,为了简单起见,我跳过了成分数组的提取。

最佳答案

使用FlatMap .

val dbProducts = networkCategories.flatMap { it. networkProducts }
    .map { DBProduct( ... ) }

val dbIngredients = networkCategories.flatMap { it. networkProducts }
    .flatMap { it.networkIngredients }.map { DBIngredient( ... ) }

如果你因为网络列表迭代不止一次而担心性能问题,并且只想迭代原始网络列表一次,那么你可以使用普通的for循环或 forEach,并自己将项目添加到三个可变列表中。

或者,您可以使用 mapTo :

val dbProducts = mutableListOf<DBProduct>()
val dbIngredients = mutableListOf<DBIngredient>()

val dbCategories = networkCategories.map {

    it.products.mapTo(dbProducts) {

        it.ingredients.mapTo(dbIngredients) {
            DBIngredient( ... )
        }

        DBProduct( ... )
    }

    DBCategory( ... )
}

关于android - Kotlin:如何使用嵌套列表映射列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59320315/

相关文章:

performance - 在 x86-64 上,32 位应用程序比 64 位应用程序有性能优势吗?

java - 对 kotlin 数据类使用 Jackson @JsonProperty 注释

Android - "firebase.test.lab"设置无法从 Firebase 分析中排除 Play 商店测试 Activity

javascript - JavaScript 中的图像预加载和顺序显示

java - 启用 ListView 中显示的号码的电话调用

python - 加速用户定义的函数

android - Gradle 3.3 版本构建失败

安卓|使用改造 2 和本地 API 的基本身份验证

android - 使用 vidyo 时,相机无法在我的应用程序中启动

android - 如何制作 Android 插页式广告?