Observable # take (Long) не возвращает желаемый размер элементов в RxJava - PullRequest
0 голосов
/ 17 ноября 2018

Я использую RxJava / Kotlin Observable#take(), чтобы получить первые 50 элементов из списка.Но оператор #take() ведет себя не так, как следует в соответствии с документами Rx.

В документах Rx #take() определяется как:

"Излучать только первые n элементов, излучаемых наблюдаемой" *

enter image description here

У меня есть такая функция:

Как мы видим, аргумент pageSize равен 50

enter image description here

И начальное size из list равно 300

enter image description here

После этого #take(50) равноприменяется к этому Observable и на следующей точке останова я все еще получаю полный размер список i.e. size = 300

enter image description here

Но just for the check, если что-то не так с отладчиком или наблюдаемым, я пытался взять только элементы, displayName которых содержит «9», но на этот раз я получаю ожидаемый результат smaller list с 9 в каждом из #displayName field.

enter image description here

Я считаю, что оператор RxJava/Kotlin's #take() не такой уж и сумасшедший, а только я.

Ответы [ 2 ]

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

take ведет себя правильно, так как даст вам только 50 List<FollowersEntry> "мраморов".Исходя из ваших скриншотов и формулировок, я думаю, вы хотели 50 FollowersEntry.Существует фундаментальная логическая разница между контейнером объектов и самими объектами.RxJava видит только последовательность объектов типа List<>, но он не может знать о вложенных объектах, с которыми вы намеревались работать.

Поэтому вы должны либо использовать it.take(50) внутри map (или что угоднофункция коллекций Kotlin есть) или разверните последовательность списков в последовательность записей через flatMapIterable:

getFollowers()
.flatMapIterable(entry -> entry)
.take(50 /* entries this time, not lists */)
0 голосов
/ 17 ноября 2018

Внимательно посмотрите на тип возврата вашего метода - Single<List<FollowersEntity>>. Наблюдаемое, возвращаемое из remoteFollowersService.getFollowers(), равно , а не . Наблюдаемое, которое испускает 300 FollowersEntity элементов - это наблюдаемое, которое испускает один item, и этот единственный элемент - List, содержащий 300 FollowersEntity предметов. Другими словами, вам нужно вызывать команду «Взять» в списке, а не в наблюдаемом.

    return remoteFollowersService.getFollowers()
        .map { val size = it.size; it } // for debugging
        .map { it.take(pageSize) }
        .map { val size = it.size; it } // for debugging
        .map { it.filter { item -> item.displayName.contains("9") } }
        .single(emptyList())
...