¿Cómo corotines de Kotlin son mejores que RxKotlin?

¿Por qué querría usar corotines de Kotlin?

Parece que la biblioteca de RxKotlin es mucho más versátil. Kotlin coroutines se ve significativamente less potente y más engorroso de usar en comparación.

Baso mi opinión en corutinas en esta charla de layout de Andrey Breslav (JetBrains): https://www.youtube.com/watch?v=4W3ruTWUhpw

Presentación de diapositivas de la charla está disponible aquí: https://www.slideshare.net/abreslav/jvmls-2016-coroutines-in-kotlin

Hay dos partes en Rx; el patrón observable y un set sólido de operadores para manipularlos, transformarlos y combinarlos. El patrón observable, por sí mismo, no hace mucho. Lo mismo hacen las Corutinas; es solo otro paradigma para lidiar con el asincronismo. Puede comparar los pros y los contras de las devoluciones de llamada, observables y corutinas para resolver un problema determinado, pero no puede comparar un paradigma con una biblioteca con todas las funciones. Es como comparar un idioma con un marco.

¿Cómo corotines de Kotlin son mejores que RxKotlin? No usé corotines todavía, pero tiene un aspecto similar a async / wait in C #. Simplemente escribe código secuencial, todo es tan fácil como escribir código síncrono … excepto que se ejecuta de forma asíncrona. Es más fácil de entender

¿Por qué querría usar kotlin coroutines? Voy a responder por mí mismo. La mayoría de las veces me quedaré con Rx, porque estoy a favor de la architecture impulsada por events. Pero debería popup la situación en la que estoy escribiendo un código secuencial, y necesito llamar a un método asíncrono en el medio, con mucho gusto aprovecharé coroutines para mantenerlo así y evitando envolver todo en Observable.

Las corotinas de Kotlin son diferentes de Rx. Es difícil compararlos manzanas a manzanas, porque las corotinas de Kotlin son una function de lenguaje delgado (con solo un par de conceptos básicos y algunas funciones básicas para manipularlas), mientras que Rx es una biblioteca bastante pesada con una gran variedad de operadores listos para usar. Ambos están diseñados para abordar un problema de progtwigción asincrónica, sin embargo, su enfoque de solución es muy diferente:

  • Rx viene con un estilo de functional programming particular que se puede implementar en prácticamente cualquier lenguaje de progtwigción sin el soporte del lenguaje en sí. Funciona bien cuando el problema en cuestión se descompone fácilmente en una secuencia de operadores estándar y no tan bien en caso contrario.

  • Las corotinas de Kotlin proporcionan una function de idioma que permite a los escritores de bibliotecas implementar varios styles de progtwigción asíncrona, que incluyen, entre otros, el estilo reactivo funcional (Rx). Con las corotinas de Kotlin también puede escribir su código asíncrono en estilo imperativo, en estilo basado en promises / futuros, en estilo de actor, etc.

Es más apropiado comparar Rx con algunas bibliotecas específicas que se implementan basadas en corotines de Kotlin.

Tome la biblioteca de kotlinx.coroutines como un ejemplo. Esta biblioteca proporciona un set de primitivas como async/await y canales que normalmente se hornean en otros lenguajes de progtwigción. También tiene soporte para actores ligeros sin futuro. Puede leer más en la Guía de kotlinx.coroutines por ejemplo .

Los canales proporcionados por kotlinx.coroutines pueden replace o boost Rx en ciertos casos de uso. Hay una guía separada para las streams reactivas con corrutinas que profundiza en las similitudes y diferencias con Rx.

El talk / doc que vinculó no habla de canales. Los canales son los que llenan el espacio entre su comprensión actual de corutinas y la progtwigción impulsada por events.

Con corrutines y canales, puede realizar la progtwigción basada en events, como probablemente esté acostumbrado a hacer con rx, pero puede hacerlo con código de aspecto síncrono y sin tantos operadores "personalizados".

Si quieres entender esto mejor, te sugiero search fuera de kotlin, donde esos conceptos son más maduros y refinados (no experimentales). Mire core.async de Clojure, videos de Rich Hickey, publicaciones y discusiones relacionadas.

  • ¿Cómo leer JSON desde Url usando kotlin Android?
  • Crear nueva instancia de object Kotlin
  • ¿Expresar "súper" generics en los types funcionales de Kotlin?
  • La biblioteca de Kotlin 'rxkotlin-0.21.0.jar' tiene un formatting no compatible. Actualice la biblioteca o el complemento
  • No se puede cambiar el text de ActionMenuItemView con RxKotlin
  • RxJava- Gire Observable en Iterator, Stream o Sequence
  • Confusión de la syntax de Kotlin lambda
  • Rx-Kotlin awaitTerminalEvent nunca se sube a Completo
  • Cómo comprimir algunos observables en lenguaje Kotlin con RxAndroid
  • Para una function de Kotlin utilizada como expresión, ¿hay una forma concisa de operar y devolver un valor?
  • Kotlin con stack RxKotlinFX da un error de class de acceso