【问题标题】:Kotlin: How to map lists with nested listsKotlin:如何用嵌套列表映射列表
【发布时间】:2020-04-06 18:33:34
【问题描述】:

我想将网络 DTO(rest api 响应)转换为 Kotlin 中的数据库 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

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

【问题讨论】:

    标签: android performance kotlin datamapper


    【解决方案1】:

    使用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( ... )
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-25
      • 2020-04-02
      • 2018-04-21
      • 1970-01-01
      • 1970-01-01
      • 2011-11-22
      • 2016-02-12
      • 1970-01-01
      相关资源
      最近更新 更多