首页 > 解决方案 > 如何对 Kotlin 列表中的项目进行分组和求和

问题描述

我有一个 dataClass OrderInProgress 列表,我需要对类似产品的价格求和并计算它们以返回 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>?>

标签: androidkotlinandroid-room

解决方案


尝试以下代码段:

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 函数对相似产品的价格求和的 a。


推荐阅读