2017-02-15 2 views
1

I RxJava seit einiger Zeit bin mit und haben sich auf dem folgenden Muster stecken geblieben, die sich wiederholt:RxJava: Verkettungs Ergebnisse von Karten Methoden

source 
.map(a -> b) 
.map(b -> c) 
.map(d -> func(a,b,c)) 

Wie Sie sehen, ich in einem unteren Punkt der Kette müssen einige von Ergebnissen der vorherigen Mapping-Methoden. Ich bin mir nicht sicher, ob dies eine Java-Einschränkung ist, da Lambda's nicht auf externe Parameter verweisen kann, die nicht endgültig sind, oder dies ist eine eingebaute Beschränkung auf Rx-Extensions. Meine aktuelle Lösung besteht darin, einen Wrapper zu verwenden, der a, b, c enthält - und jeden innerhalb der Map zu addieren und dann die Wrapper-Klasse zurückzugeben. Aber diese Lösung fühlt sich nicht schreiben.

Gibt es eine bessere Lösung?

Antwort

3

Wenn die map s direkt aufeinander folgen, können Sie sie in einer einzigen Karte kompakt und verfügen über alle Zwischendaten zur Verfügung, die letzte Funktion:

source.map(a -> { 
    T b = fa(a); 
    U c = fc(b); 
    return func(a, b, c); 
}) 

Wo T und U sind die Arten der Zwischenwerte von b bzw. c.

+0

das wäre ok im Falle mehrerer Karten. aber sobald Sie einen Filter oder Zip oder eine andere Kombination haben, wird es nicht funktionieren – chaimt

+0

Dann müssen Sie einen Wrapper in jeder Phase verwenden. – akarnokd