[英]Kotlin Filter list according to another list
我有一個所有市場類型的列表,以及所有市場的列表(每個對象都有一個市場typeId)
我想要一個僅包含所有市場列表中的市場類型的市場類型列表(沒有重復的市場類型)。 怎么做?
這是我的代碼:
for (i in marketsFilter.indices) {
val market = marketsFilter[i]
marketTypes.add(MyApplication.allMarketTypes.single {
it.id == market.marketTypeId
})
}
您可以使用map
來表達更為簡潔:
marketsFilter.map { market ->
MyApplication.allMarketTypes.single { it.id == market.marketTypeId }
}.distinct()
無需處理原始索引。
注意:如果要使用單實例,請查看下面的列表,然后自己決定。
single
:返回與給定謂詞匹配的單個元素,如果不存在一個或多個匹配元素,則拋出異常。
singleOrNull
:返回與給定謂詞匹配的單個元素;如果未找到元素或找到多個元素,則返回null
。
first
:返回與給定謂詞匹配的第一個元素,如果不存在則拋出異常。
firstOrNull
:返回與給定謂詞匹配的第一個元素;如果未找到元素,則返回null
。
如果決定使用...OrNull
變體,請使用mapNotNull
放棄空值。
marketsFilter.mapNotNull { market ->
// ...
}.distinct()
for (i in marketsFilter.indices) {
val market = marketsFilter[i]
marketTypes.add(
MyApplication.allMarketTypes.single { it.id == market.marketTypeId })
}
marketTypes = marketTypes.distinct().toMutableList()
您可能對以下內容感興趣:
val marketTypes = marketsFilter.mapNotNull { market ->
MyApplication.allMarketTypes
.singleOrNull { it.id == market.marketTypeId }
}.distinct().toMutableList()
反之亦然,您可能會感興趣,基本上只過濾市場類型作為市場過濾器的ID,例如:
val marketTypes = MyApplication.allMarketTypes.filter { type -> marketsFilter.any { it.marketTypeId == type.id } }
.toMutableList() // no distinct needed
您可能還需要更換任何.distinct().toMutableList()
與.toMutableSet()
如果這也符合您需求。
另請注意,如果您經常檢查allMarketTypes
,則可能希望將它們放在地圖中,例如:
val allMarketTypesMap = allMarketTypes.associateBy { it.id }
這樣,您的進一步映射將變得更加容易,例如:
val marketTypes = marketsFilter.mapNotNull { allMarketTypesMap[it.marketTypeId] }
.distinct().toMutableList() // or just .toMutableSet()
作為allMarketTypes
重復項的allMarketTypes
(如果有的話): associateBy
將僅收集具有相同ID的所有條目中的最后一個,基本上丟棄任何重復的市場類型。 另一方面,如果存在一個以上具有相同id或沒有id的市場類型,則single
基本上將失敗(或者,如果您使用singleOrNull
它將返回null
)。 要時刻銘記在心。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.