Kotlin Фильтр списка по другому списку - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть список всех типов рынков и список всех рынков (каждый объект имеет идентификатор типа рынка)

Я хочу иметь список типов рынков, содержащий только типы рынков в списке всех рынков(без дублирования типов рынка).Как это сделать?

Вот мой код:

for (i in marketsFilter.indices) {
    val market = marketsFilter[i]
    marketTypes.add(MyApplication.allMarketTypes.single { 
        it.id == market.marketTypeId 
    })
}

Ответы [ 3 ]

0 голосов
/ 21 ноября 2018

Вы можете выразить это более кратко, используя map:

marketsFilter.map { market ->
   MyApplication.allMarketTypes.single { it.id == market.marketTypeId }
}.distinct()

Нет необходимости обрабатывать необработанные индексы.

Примечание: Если вы хотите использовать single зависит от вашего варианта использования, посмотрите список ниже и решите сами.


single: Возвращает единственный элемент, соответствующий данному предикату, или выдает исключение, если естьнет или более одного совпадающего элемента.

singleOrNull: возвращает один элемент, соответствующий данному предикату, или null, если элемент не был найден или было найдено более одного элемента.

first: Возвращает первый элемент, соответствующий данному предикату, или выдает исключение, если его нет.

firstOrNull:Возвращает первый элемент, соответствующий данному предикату, или null, если элемент не был найден.

Если вы решили использовать вариант ...OrNull, используйте mapNotNull, чтобы отбросить нулевые значения.

marketsFilter.mapNotNull { market ->
    // ...
}.distinct()
0 голосов
/ 21 ноября 2018

Возможно, вас заинтересует следующее:

val marketTypes = marketsFilter.mapNotNull { market ->
                                  MyApplication.allMarketTypes
                                                        .singleOrNull { it.id == market.marketTypeId }
                               }.distinct().toMutableList()

Возможно, вас заинтересует обратный подход, в основном фильтрующий только типы рынка для идентификаторов фильтра рынка, например:

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 (в случае их наличия): associateBy будет собирать только последние из всех записей с одинаковым идентификатором, в основном отбрасывая дубликаты любого типа рынка.single, с другой стороны, в основном потерпит неудачу, если существует более одного типа рынка с одинаковым идентификатором или его нет (или если вы используете singleOrNull, вместо этого он вернет null).Просто имейте это в виду.

0 голосов
/ 21 ноября 2018
for (i in marketsFilter.indices) {
     val market = marketsFilter[i]
     marketTypes.add(
         MyApplication.allMarketTypes.single { it.id == market.marketTypeId })
}

marketTypes = marketTypes.distinct().toMutableList()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...