0

我有一个带有字符串列表的可观察对象,另一个带有字符串列表列表的对象。我需要重用第一个 observable 直到每个字符串都被设置

简而言之。我需要遍历列表列表的每个元素并将其附加到第一个可观察的列表元素

我了解了 retryWhen 但不知道如何重用第一个 observable 并继续第二个

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"}

4

2 回答 2

0

根据您的示例:

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();
}

我希望这有帮助。

于 2019-05-24T10:07:03.660 回答
0

我不确定“重用”是什么意思。如果这意味着您只想订阅第一个 observable 一次,那么您可以执行以下操作(基于您的示例):

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") }
        )
}
于 2019-05-24T11:01:17.330 回答