Die vorhandenen Antworten sind umfassend und korrekt, aber ein klares Beispiel für Anfänger fehlt. Gestatten Sie mir, einige Begriffe wie "push/pull-based" und "re-observable" zu hinterfragen. Hinweis: Ich hasse den Begriff Observable
(es ist ein Strom um Himmels Willen), so wird einfach auf J8 vs RX-Streams beziehen.
Betrachten wir eine Liste, wenn ganze Zahlen,
digits = [1,2,3,4,5]
Ein J8-Stream ist ein Dienstprogramm, um die Sammlung zu ändern. Zum Beispiel können auch Ziffern extrahiert werden,
evens = digits.stream().filter(x -> x%2)
Diese im Grunde das ist Python map, filter, reduce, ein sehr schönes (und längst überfälligen) zusätzlich zu Java. Was aber, wenn die Ziffern nicht vorher gespeichert werden? Kann man die geraden Ziffern noch filtern?
Stellen ein separater Thread Prozess ganze Zahlen zufällig Ausgeben (---
bezeichnet die Zeit)
digits = 12345---6------7--8--9-10--------11--12
In RX, even
auf jede neue digit reagieren kann und die Filter in Echtzeit
even = -2-4-5---6---------8----10------------12
gilt
Es ist nicht erforderlich, Eingabe- und Ausgabelisten zu speichern. Wenn Sie eine Ausgabeliste wollen, kein Problem, das auch streamable ist. In der Tat, everything is a stream.
evens_stored = even.collect()
Aus diesem Grund Begriffe wie "stateless" und "funktional" sind mehr mit RX
FYI gibt es Vorschläge, um mehr RxJava wie Klassen in JDK 9. http vorstellen: // jsr166 -concurrency.10961.n7.nabble.com/jdk9-Candidate-classes-Flow-and-SubmissionPublisher-td11967.html –
@JohnVint Was ist der Status dieses Vorschlags? Wird es tatsächlich fliegen? –
@IgorGanapolsky Oh ja, es sieht definitiv so aus, als würde es in jdk9 landen. http://cr.openjdk.java.net/~martin/webrevs/openjdk9/jsr166-jdk9-integration/. Es gibt sogar einen Port für RxJava zum Fließen https://github.com/akarnokd/RxJavaUtilConcurrentFlow. –