我有以下的類:
class UserData(
val firstSale: 日期。
val lastSale: 日期。
val ptuCodesList: List<ItemSale>,
val taxList: List<ItemSale>。
val salesList: List<ItemSale>。
val taxTotal: Long,
val saleTotal: Long,
val currency: String = DEAFULT_CURRENCY,
val canceledOrderCount: Int,
val canceledSaleTotal: Long,
)
和模型類:
class ItemSale(
val itemDescription: 字串。
val itemsTotalValue: 長
)
我正在從我的資料庫中獲取所有的UserData物件:
我正在獲取所有的UserData物件。
dbRepository.getAllUsersData(): List<UserData>
現在我不知道如何對這個List UserData物件求和并作為單一物件回傳,我的意思是,我不知道如何對UserData物件中包含的那些串列taxList/saleList求和。在這些串列中,我需要求和 itemsTotalValue。
例子:
我們有兩個UserData物件的串列:
/1
class UserData(
val firstSale: 238402384092L,
val lastSale: 893231117482L,
val ptuCodesList: List<ItemSale>,
val taxList: List<ItemSale>, //("第一", 4), ("第二", 4)
val salesList: List<ItemSale>, //("第三", 5), ("第四", 3)
val taxTotal: 500,
val saleTotal: 600,
val currency: String = DEAFULT_CURRENCY,
val canceledOrderCount: 3,
val canceledSaleTotal: 4500[/span
)
/2
class UserData(
val firstSale: 338402384092L,
val lastSale: 9934798237482L,
val ptuCodesList: List<ItemSale>,
val taxList: List<ItemSale>, //("第一", 7), ("第二", 8)
val salesList: List<ItemSale>, //("第三", 1), ("第四", 2)
val taxTotal: 250,
val saleTotal: 400,
val currency: String = DEAFULT_CURRENCY,
val canceledOrderCount: 4,
val canceledSaleTotal: 400
)
我們需要像這樣對它們進行求和:
/result 1 2
class UserData(
val firstSale: 238402384092L,
val lastSale: 9934798237482L,
val ptuCodesList: List<ItemSale>, //對所有物件保持不變。
val taxList: List<ItemSale>, //("第一", 11), ("第二", 12)
val salesList: List<ItemSale>, //("第三", 6), ("第四", 5)
val taxTotal: 750,
val saleTotal: 1000,
val currency: String = DEAFULT_CURRENCY, // Stay for all same。
val canceledOrderCount: 7,
val canceledSaleTotal: 4900[/span>]
)
uj5u.com熱心網友回復:
歡迎Jumanji,
你需要一步一步地做,即分別計算你需要計算的每個欄位,最后只需使用這些計算的欄位創建一個UserData的實體。
更多的細節--你可以創建輔助方法來連接("sum")兩個List<ItemSale>的串列,看起來像這樣:
private fun concatenateItemSales(sales1。List<ItemSale>, sales2: List<ItemSale> ): List<ItemSale> {
val itemsFromSales1ConcatenatedWithSales2: List<ItemSale> = sales1.map { item1 ->
val item2Value: Long? = sales2.find { it.itemDescription == item1.itemDescription }?.itemsTotalValue
val itemsTotalValue = item1.itemsTotalValue (items2Value ? : 0L)
ItemSale(item1.itemDescription, itemsTotalValue)
}
val sales1ItemDescriptions: List<String> = sales1.map { it.itemDescription }
val itemsFromSales2NotInSales1: List<ItemSale> = sales2.filter { it.itemDescription !in sales1ItemDescriptions }
return itemsFromSales1ConcatenatedWithSales2 itemsFromSales2NotInSales1
}
這個函式假設可能出現的專案只存在于這兩個串列中的一個--出于安全考慮。如果你確定總是有完全相同的專案(有相同的描述),并且不會有這樣的差異--你總是可以簡化這個代碼。 你也可以改進這個函式的代碼,使用像broot在另一個答案中提出的功能風格。我更關注的是想法而不是提供最好的代碼。
有了這個函式,你應該很容易創建串聯的UserData,例如,這樣:
class UserData(...){
operator fun plus(otherData: UserData): 用戶資料 {
val firstSale = min(this.firstSale, anotherData.firstSale)
val taxList = concatenateItemSales(this.taxList, anotherData.taxList)
val salesList = conatenateItemSales(this.salesList, anotherData.salesList)
val taxTotal = this.taxTotal anotherData.taxTotal
//和類似地計算你需要的其他欄位。
return UserData(firstSale, ..., taxList, salesList, taxTotal, ...)
}
}
現在你可以使用 運算子將兩個UserData實體相加/連接,就像這樣:
val userData1: UserData = UserData(..)
val userData2: UserData = UserData(...)
val conacatenatedUserData = userData1 userData2
uj5u.com熱心網友回復:
由于你特別要求taxList和salesList,我將忽略所有其他的屬性,而專注于它們。我們可以用這段代碼來計算taxList的總和:
val data: List<UserData> = ...
val taxList = data.asSequence()
.flatMap { it.taxList }
.groupingBy { it.itemDescription }
.fold(0L) { acc, item -> acc item.itemsTotalValue }
.map { ItemSale(it.key, it.value) }
我們將一步一步地瀏覽這段代碼:
。flatMap()將所有UserData物件的所有taxList屬性合并為一個ItemSale物件的單一串列。它包含重復的內容,例如多個first專案。groupingBy()通過名稱/描述來分組ItemSale專案。然后,我們可以很容易地對例如第一個專案與其他專案分開作業。fold()是真正發生求和的地方。它分別對上述每一組進行作業,它從0L值開始求和,每一個新的專案(例如,每一個新的第一個專案),它將itemsTotalValue添加到累積值。- 在這一點上,我們有一個
Map<String, Long>,其中鍵是itemDescription字串,值是具有此特定itemDescription專案的itemsTotalValue屬性的總和。 - 最后,我們需要將地圖轉換為
ItemSale的串列,我們在map步驟中完成。
由于我們使用了asSequence()和groupingBy()(而不是groupBy()),所有的資料都是懶散地計算的。這意味著它的作業方式與我們依次遍歷所有專案一樣,在遍歷的同時計算結果。這對于性能來說是很好的。
salesList可以用完全相同的方式計算,我們只需要修改flatMap()步驟。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/321607.html
標籤:
上一篇:在路由中傳遞URL引數
