Есть ли способ повторно использовать одну наблюдаемую, пока вторая не получит onComplete () в zip? - PullRequest
0 голосов
/ 23 мая 2019

У меня есть одна наблюдаемая со списком строк и другая со списком строк. Мне нужно повторно использовать первое наблюдаемое, пока каждая строка не будет разбита

Короче. Мне нужно перебрать каждый элемент списка списка и прикрепить его к первым наблюдаемым элементам списка

Я узнал о повторных попытках, но не знаю, как повторно использовать первое наблюдаемое и продолжить на втором

val cat = sheetsViewer.GOOGLE_SHEETS_ENDPOINT_IMPL.readSpreadSheet(spreadsheetId, "A4:DA4")
            .toObservable()
            .flatMap { Observable.fromIterable(it) }


val data = sheetsViewer.GOOGLE_SHEETS_ENDPOINT_IMPL.readSpreadSheet(spreadsheetId, range)
            .toObservable()
            .subscribeOn(Schedulers.computation())
            .flatMap { Observable.fromIterable(it) }
            .map {
                val newList = it.toMutableList()

                while (newList.size != 105)
                    newList.add("")

                return@map newList
            }

У меня есть список строк {"a", "b"} а второй {{"a", "b"}, {"c", "d"}, {"e", "f"}}

Я ожидаю, что выходные данные будут {"aa", "bb", "ca", "db", "ea", "fb"}

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

Я не уверен, что вы имеете в виду под "повторным использованием".Если это означает, что вы хотите подписаться на первое наблюдаемое только один раз, то вы можете сделать следующее (на основе вашего примера):

fun main() {
    val listOfStringsObs = listOf("a", "b").toObservable()
    val listOfListOfStringsObs = listOf(
        listOf("a", "b"),
        listOf("c", "d"),
        listOf("e", "f")
    ).toObservable()

    listOfStringsObs
        .toList() // transforming Observable<String> to Single<List<String>> so we could subscribe on the single only once and then reuse the value
        .flatMapObservable { listOfStrings ->
            listOfListOfStringsObs
                .flatMap { element ->
                    element
                        .zip(listOfStrings) { a, b -> a + b } // zipping listOfStrings with each element from listOfListOfStrings by concatenating the strings
                        .toObservable()
                }
        }
        .subscribe(
            { println("Data: $it") },
            { println("Error: $it") },
            { println("Done") }
        )
}
0 голосов
/ 24 мая 2019

На основе вашего примера:

public static void main(String[] args) {
    final Flowable<List<String>> listOfStrings = Flowable.fromIterable(asList(asList("a", "b"),
                                                                       asList("c", "d"),
                                                                       asList("e", "f")));
    final Flowable<String> strings = Flowable.fromIterable(asList("a", "b"));

    listOfStrings.flatMap(list -> Flowable.zip(Flowable.fromIterable(list),
                                               strings,
                                              (s1, s2) -> s1 + s2))
                 .subscribe(System.out::println,
                            System.err::println);

    Flowable.timer(10, SECONDS) // Just to block the main thread for a while
            .blockingSubscribe();
}

Надеюсь, это поможет.

...