Фильтрация списка внутри наблюдаемой коллекции - PullRequest
0 голосов
/ 27 февраля 2020

Я хочу отфильтровать List <Notification>, который находится внутри Observable коллекции по указанному событию.

Вот вызов дооснащения:

@GET("/notifications")
Observable<NotificationCollection> getNotifications(@Query("page") Integer page);

NotificationCollection модель:

class NotificationCollection {
         var items: List<Notification>? = null
         var pagination: Pagination? = null
}

Notification модель:

class Notification {
        var event: String? = null
        var id: Long? = null
        var data: NotificationData? = null
}

В своем классе помощника я возвращаю Observable интерактору:

override fun getNotifications(page: Int): Observable<NotificationCollection> {
        return service.getNotifications(page)
    }

Я попробовал несколько подходов:

override fun getNotifications(page: Int): Observable<NotificationCollection> {
return service.getNotificationsTimeline(page)
    .filter { it.items?.get(0)?.event == "STORY"}
}

Здесь я хочу применить предикат ко всем элементам списка, а не только к тем, которые я определяю по индексу. Есть ли способ сделать что-то вроде .filter { it.items.event = "STORY"}?

Другой подход, который я попытался использовать flatMap, который имеет для меня больше смысла, но я не вижу способа сопоставить отфильтрованный результат с оригиналом тип ответа Observable<NotificationCollection>, а не Observable<Notification>, как здесь:

return service.getNotifications(page)
    .flatMap { Observable.fromIterable(it.items) }
    .filter {it.event == "STORY"}

Самый простой способ - применить filter в моем классе докладчика с помощью flatMap, но я хочу обобщить свой решение, потому что метод в классе помощника вызывается в разных местах. Поэтому я хочу сделать список отфильтрованным здесь.

Итак, есть ли способ отфильтровать список в коллекции Observable и вернуть исходный тип ответа Observable<NotificationCollection>?

1 Ответ

0 голосов
/ 27 февраля 2020

Вы должны использовать 'filter' и 'any' вместе.

class Test {
    init {
       val testList = listOf(
               TestData("1","1", listOf("1a")),
               TestData("2","2", listOf("2b")),
               TestData("3","3", listOf("3c")))

        val result = testList.filter { item ->
            item.c.any { it == "STORY" }
        }
    }
}

data class TestData(val a: String, val b: String, val c: List<String>)
...