簡體   English   中英

Kotlin篩選器列表,根據另一個列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM