2017-07-20 2 views
3

Nehmen wir an, ich habe eine Funktion, die eine String und eine long nimmt und eine Single<String> zurückgibt.RxJava - Wie kombiniere ich Scan und FlatMap?

Single<String> stringAddition(String someString, long value) { 
    return Single.just(someString + Long.toString(value)); 
} 

Jetzt habe ich diese Observable ...

Observable.interval(1, SECONDS) 
    .scan("", (cumulativeString, item) -> { 
    // Need to return the result of stringAddition(cummulativeString, item) 
    }); 

ich ratlos bin, wie dies zu tun. Scan benötigt mich, um eine String zurückzugeben, aber II möchte die Methode verwenden, die eine Single<String> zurückgibt. Für mich scheint es, als ob ich etwas brauche, das das Verhalten von scan und flatMap kombinieren kann. Gibt es irgendeine RxJava2-Zauberei, die mir helfen kann?

+0

Warum Sie in erster Linie '' Einzel kehren? – akarnokd

+0

Ich habe versucht, ein einfaches Beispiel für ein Problem zu finden, das im Kontext viel komplexer ist. In meinem aktuellen Projekt ist es eigentlich eine Web-Service-Anfrage von 'Single '. –

+0

Ich merke jetzt, dass mein Beispiel eigentlich zu trivial ist, um das Problem, das ich zu lösen versuche, korrekt zu demonstrieren. Wenn ich mit 'Single ' als akkumuliertem Wert scanne, beende ich tatsächlich jede Anfrage zweimal :( –

Antwort

3

Sie können es wie folgt erreichen. Dies kann etwas verkürzt werden, wenn stringAdditionObservable zurückgekehrt

Observable<String> scanned = Observable.interval(1, TimeUnit.SECONDS) 
      .scan(
        Observable.just(""), 
        (cumulativeString, item) -> 
         cumulativeString 
          .flatMap(str -> stringAddition(str, item).toObservable()) 
      ) 
      .flatMap(it -> it); 
würde
+0

Diese Antwort funktioniert in der Tat für mein triviales Beispiel. Ich denke jedoch, dass diese Antwort jede 'Single 'zweimal abonniert; einmal in der "flatMap" innerhalb des Scans und wieder in der äußeren "flatMap". Können Sie sich irgendwelche Lösungen vorstellen, bei denen die Single nicht doppelt abonniert wurde? –

+0

Ich meine, ich denke, ich könnte sie benutzen '.cache()' auf dem 'Observable' von' scan' erzeugt und das sollte funktionieren, aber ich habe das Gefühl, dass es einen besseren Weg geben sollte! –