Как сделать оператор фильтра из списка списка в rxjava

Добрый день. Итак, у меня есть список со списком внутри вроде этого:

    {
  "category" : [
    {
      "name": "Bathroom",
      "products": [
        {
          "name": "Sink01"
        },
        {
          "name": "Shower01"
        }
      ]
    },{
      "name": "Kitchen",
      "products": [
        {
          "name": "Table"
        },
        {
          "name": "Stove"
        }
      ]
    }
  ]
}

Итак, если пользователь, например, выбирает категорию «Ванная», я хочу использовать rxjava для фильтрации списка продуктов из категории «Ванная», и если они выбирают категорию «Кухня», я хочу получить список продуктов из категории » Кухня".

Вот что я пробовал до сих пор:

    fun getProducts(category: Category): Single<MutableList<Product>> {
         return service.getProductsByCategories().filter{ response ->
             response.categoriesList.forEach {
                if (it.name == category.name) {
                  category.products
                }
             }
         }
    }

Прямо сейчас я получаю «Несоответствие набранного номера. Реквизиты: Single<MutableList<Product>>, Найдено: Maybe<MyResponse!>!»

Почему это происходит? Как правильно фильтровать?

Заранее спасибо.

Привет


person linker85    schedule 04.02.2020    source источник
comment
Не могли бы вы уточнить, какой тип возвращает service.getProductsByCategories()? Кроме того, каким бы ни был этот тип, я сомневаюсь, что его метод filter ожидает лямбда, которая возвращает список «вещей» вместо логического (true или false).   -  person ysakhno    schedule 05.02.2020
comment
Он возвращает единый ‹Список ‹Categories››, внутри каждой категории есть список продуктов.   -  person linker85    schedule 05.02.2020


Ответы (1)


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

getProductsByCategories()
.flattenAsObservable { it }
.filter { it.name == category.name }
.map { it.products }
.single( ArrayList<Product>() )
person akarnokd    schedule 06.02.2020
comment
list - ›list // какого типа должен быть список? - person linker85; 06.02.2020
comment
Верно, это Котлин. Тогда просто { it }. Обновил ответ. - person akarnokd; 06.02.2020
comment
внес некоторые незначительные изменения, чтобы сделать его сборку - person linker85; 06.02.2020
comment
getProductsByCategories () .flattenAsObservable {it.categoriesList} .filter {it.name == category} .map {it.products} .single (ArrayList ()) - person linker85; 06.02.2020