我如何在 Kotlin 中对列表中的项目进行分组和求和
How can I groupby and sum items from a list in Kotlin
我有一个 dataClass OrderInProgress 列表,我需要对相似产品的价格求和并将它们计入 return CartDetail 列表,类似于房间数据库的查询。我该怎么做?
@Entity(tableName = "order_in_progress")
data class OrderInProgress(
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id")
var id: Int = 0,
@ColumnInfo(name = "product")
var product: String,
@ColumnInfo(name = "price")
var price: Double
)
data class CartDetail(
@ColumnInfo(name = "product")
val product: String,
@ColumnInfo(name = "sum_price")
val sumPrice: Double,
@ColumnInfo(name = "product_count")
val productCount: Int
)
这是房间查询
@Query(
"SELECT product, SUM(price) as sum_price, COUNT(product) as product_count " +
"FROM order_in_progress GROUP BY product"
)
fun getCart(): Flow<List<CartDetail>?>
试试下面的代码片段:
fun getCartDetails(orders: List<OrderInProgress>): List<CartDetail> {
return orders.groupBy { it.product }.map { entry ->
val productType = entry.key
val products = entry.value
CartDetail(
productType,
products.map { it.price }.reduce { acc, price -> acc + price },
products.size
)
}
}
它使用 group by 将类似产品关联到类型 Map<String, List<OrderDetails>>
的映射中,然后将每个条目映射到 CartDetail
,后者使用 reducer 函数对类似产品的价格求和。
如果您有一个名为 'orderInProgressList' 的 OrderInProgress-Instances 列表,您应该能够使用以下代码生成相关的 CartDetails 列表。
val cartDetailList = orderInProgressList
.groupBy { it.product }
.map { CartDetail(it.key, it.value.sumOf { it.price }, it.value.size) }
我有一个 dataClass OrderInProgress 列表,我需要对相似产品的价格求和并将它们计入 return CartDetail 列表,类似于房间数据库的查询。我该怎么做?
@Entity(tableName = "order_in_progress")
data class OrderInProgress(
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id")
var id: Int = 0,
@ColumnInfo(name = "product")
var product: String,
@ColumnInfo(name = "price")
var price: Double
)
data class CartDetail(
@ColumnInfo(name = "product")
val product: String,
@ColumnInfo(name = "sum_price")
val sumPrice: Double,
@ColumnInfo(name = "product_count")
val productCount: Int
)
这是房间查询
@Query(
"SELECT product, SUM(price) as sum_price, COUNT(product) as product_count " +
"FROM order_in_progress GROUP BY product"
)
fun getCart(): Flow<List<CartDetail>?>
试试下面的代码片段:
fun getCartDetails(orders: List<OrderInProgress>): List<CartDetail> {
return orders.groupBy { it.product }.map { entry ->
val productType = entry.key
val products = entry.value
CartDetail(
productType,
products.map { it.price }.reduce { acc, price -> acc + price },
products.size
)
}
}
它使用 group by 将类似产品关联到类型 Map<String, List<OrderDetails>>
的映射中,然后将每个条目映射到 CartDetail
,后者使用 reducer 函数对类似产品的价格求和。
如果您有一个名为 'orderInProgressList' 的 OrderInProgress-Instances 列表,您应该能够使用以下代码生成相关的 CartDetails 列表。
val cartDetailList = orderInProgressList
.groupBy { it.product }
.map { CartDetail(it.key, it.value.sumOf { it.price }, it.value.size) }