Kotlin 1.5.42
我有以下資料類,我需要過濾掉2級和3級的值。然后我使用for...回圈遍歷level2,并檢查level3是否有一個parentId與level2的value匹配。
這將被添加到一個串列中。當level3的回圈完成后,我將添加到map中,key是level2的物件,value是level3的串列。
i.e.
Map<TopsProductFilterItem, List<TopsProductFilterItem>>/code>
我正在尋找一個更好的解決方案,使用kotlin更簡潔,并尋找associateBy或assoicateWith是否有幫助。
data class TopsProductFilterItem(
val value: String = ""。
val catalogSearchCustomAttribute: CatalogSearchCustomAttribute = CatalogSearchCustomAttribute()。
)
還有下面這個擁有級別的資料類
data class CatalogSearchCustomAttribute(
val level: Int = 0,
val parentId。Int = 0)
由于可以有很多級別分配給他的類,我只對第2級和第3級感興趣。所以我已經把它們過濾掉了,如下所示。
private fun createMapOfLevelCategories(listOfTopsProductFilterItem: List<TopsProductFilterItem>) {
val listOfLevel2 = listOfTopsProductFilterItem.filter{ topsProductFilterItem ->
topsProductFilterItem.catalogSearchCustomAttribute.level ==2
}
val listOfLevel3 = listOfTopsProductFilterItem.filter { topsProductFilterItem ->
topsProductFilterItem.catalogSearchCustomAttribute.level ==3
}
val mapOfCategoryLevel2 = mutableMapOf<TopsProductFilterItem, List<TopsProductFilterItem> >()
listOfLevel2.forEach { categoryLevel2 ->
/* 從第3級和第2級的值中找到父級id */。
val listOfCategoryLevel3 = mutableListOf<TopsProductFilterItem>()
listOfLevel3.forEach { categoryLevel3 ->
if(categoryLevel2.value.toInt() == categoryLevel3.catalogSearchCustomAttribute.parentId) {
/* 找到一個匹配的父級ID和值 */。
listOfCategoryLevel3.add(categoryLevel3)
}
}
mapOfCategoryLevel2.put(categoryLevel2, listOfCategoryLevel3)
}
}
uj5u.com熱心網友回復:
你可以做listOfLevel2.associateWith { ... }。associatedWith創建的map的鍵與你呼叫它的iterable相同,但允許你指定你希望每個鍵的關聯值如何被轉換。在這種情況下,我們希望值是第3級串列中所有具有parentId等于鍵的value.toInt()的專案。
listOfLevel2.associateWith { level2 ->
listOfLevel3.filter { level3 ->
level2.value.toInt() == level3.catalogSearchCustomAttribute.parentId
}
}
甚至更好的是,你可以先對第3級的父Ids做一個groupBy,然后你就不必在associatedWith中一遍又一遍地回圈listOfLevel3:
listOfLevel3.groupBy { it.catalogSearchCustomAttribute.parentId }.let { parentIdGroups ->
listOfLevel2.associateWith { level2 ->
parentIdGroups[level2.value.toInt()] ? : emptyList()
}
}
uj5u.com熱心網友回復:
這可能是一個關于代碼可讀性的品味問題,但我將這樣做:
private fun createMapOfLevelCategories(listOfTopsProductFilterItem: List<TopsProductFilterItem>)。Map<TopsProductFilterItem, List<TopsProductFilterItem> > {
//創建地圖: parentId -> (parent, children)
val resultById = listOfTopsProductFilterItem
.過濾器 { it.catalogSearchCustomAttribute.level == 2 }
.關聯 {
it.value.toInt() to Pair(it, mutableListOf<TopsProductFilterItem> ())
}
//將子女與父母聯系起來。
串列中的TopsProductFilterItem
.filter { it.catalogSearchCustomAttribute.level == 3 }
.forEach {
resultById.getValue(it.catalogSearchCustomAttribute.parentId).second = it
}
return resultById.values.toMap()
}
我不會說這是一個簡單的閱讀和理解,但至少對我來說,它比你的實作更干凈。它的性能也應該更好一些,因為我們只對第三級專案進行一次迭代,而不是對每一個第二級專案進行一次。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/311870.html
標籤:
