Las respuestas existentes son completas y correctas, pero falta un ejemplo claro para principiantes. Permítanme poner algunos términos concretos detrás de "push / pull-based" y "re-observable". Nota : Odio el término Observable
(es una transmisión por amor de Dios), así que simplemente me referiré a las transmisiones J8 vs RX.
Considere una lista de enteros,
digits = [1,2,3,4,5]
Un J8 Stream es una utilidad para modificar la colección. Por ejemplo, incluso los dígitos se pueden extraer como,
evens = digits.stream().filter(x -> x%2).collect(Collectors.toList())
Esto es básicamente el mapa de Python , filtro, reducción , una adición muy agradable (y muy atrasado) a Java. Pero, ¿qué pasaría si los dígitos no se recopilaran antes de tiempo? ¿Qué pasaría si los dígitos se transmitieran mientras la aplicación se estaba ejecutando? ¿Podríamos filtrar los pares en tiempo real?
Imagine que un proceso de subproceso separado genera números enteros en momentos aleatorios mientras la aplicación se está ejecutando ( ---
indica el tiempo)
digits = 12345---6------7--8--9-10--------11--12
En RX, even
puede reaccionar a cada nuevo dígito y aplicar el filtro en tiempo real
even = -2-4-----6---------8----10------------12
No es necesario almacenar listas de entrada y salida. Si desea una lista de salida, no hay problema que sea transferible también. De hecho, todo es una corriente.
evens_stored = even.collect()
Es por eso que términos como "sin estado" y "funcional" están más asociados con RX