Kotlin:如何使用嵌套列表映射列表
Kotlin: How to map lists with nested lists
我想将网络 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
在上面的代码中,为了简单起见,我跳过了成分数组的提取。
使用.
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( ... )
}
我想将网络 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
在上面的代码中,为了简单起见,我跳过了成分数组的提取。
使用
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( ... )
}