Commit 43aa8395 authored by Julien SADAOUI's avatar Julien SADAOUI
Browse files

feat: RxJava - Level 4

parent 28662cfb
......@@ -51,4 +51,26 @@ Nous allons aborder un concept clé dans la programmation. Il s'agit des flux qu
Un **Cold Stream** recommence au début du flux pour chaque consommateur (**subscriber/observer**). Chaque consommateur obtient la liste complète des éléments.
Contrairement à un **Cold Stream**, un **HotStream** envoie les mêmes éléments à tous les consommateurs. Si un consommateur souscrit après le début de l'émission du flux, il ne receverra pas les éléments précédement émis.
\ No newline at end of file
Contrairement à un **Cold Stream**, un **HotStream** envoie les mêmes éléments à tous les consommateurs. Si un consommateur souscrit après le début de l'émission du flux, il ne receverra pas les éléments précédement émis.
### D. Level 4
Les types de flux
RX Java possède plusieurs types Java afin de spécialiser certains flux :
| Type | Description | Back pressure |
| ------------- | ---------------------------------------------------------------------|:--------------:|
| Single | Un flux émettant une unique valeur | Non |
| Maybe | Un flux émettant 0 ou 1 valeur au plus | Non |
| Completable | Un flux n'émettant pas de valeur | Non |
| Observable | Un flux émettant une séquence de données potentiellement illimitée | Non |
| Flowable | Un flux émettant une séquence de données potentiellement illimitée | Oui |
- **Single** est une version limitée de **Observable**. Nous verrons plus tard que certains opérateurs ne sont pas disponibles avec un **Single**. Les méthodes **doOnNext** et **doOnComplete** sont remplacées par **doOnSuccess**. Dans une application web, **Single** est utilisé lorsqu'un service REST retourne une unique ressource.
- **Single** n'accepte pas la valeur `null`. **Maybe** accepte un flux vide et peut donc avoir une valeur ou aucune.
- **Completable** n'émet aucune valeur, il exécute une action sans retourner de valeur. En conséquence, il ne fournit pas de méthode **doOnNext**. Dans une application web, **Completable** est utilisé lorsqu'un service REST exécute un traitement sans retourner de résultat.
- **Flowable** est une version améliorée de **Observable** supportant la back pressure.
\ No newline at end of file
package fr.ippon.codingdojo.reactive;
import io.reactivex.Completable;
import io.reactivex.Maybe;
import io.reactivex.Single;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.atomic.AtomicBoolean;
/**
*
*/
@Slf4j
public class Level4 {
public static void main(String[] args) {
//TODO: créer un flux émettant une valeur
Single.just("Superman")
.doOnSuccess(s -> log.info("Hello " + s))
.subscribe();
exercise1();
exercise2();
exercise3();
exercise4();
}
//
// Completable
/**
* Crée un {@link Single} qui émet une unique valeur. Un {@link Single} n'accepte pas la valeur `null`, le flux ne peut pas être vide.
*
* <p><p>
* Note : sortie attendue
* <li>
* <ul>Start Level4/exercise1</ul>
* <ul>Value: Flash McQueen</ul>
* <ul>Stop</ul>
* </li>
* <p>
* Remarque : Les méthodes {@link io.reactivex.Observable#doOnNext} et {@link io.reactivex.Observable#doOnComplete}
* sont remplacées par la méthode {@link Single#doOnSuccess}.
*/
public static void exercise1() {
log.info("Start Level4/exercise1");
Single.just("Flash McQueen")
.doOnSuccess(item -> log.info("Value: " + item))
.subscribe();
log.info("Stop");
}
Maybe.just("Superman")
.subscribe(
name -> System.out.println("[A] Received " + name),
Throwable::printStackTrace,
() -> System.out.println("[A] Completed")
);
/**
* Crée un {@link Maybe} qui émet une valeur. Un {@link Maybe} accepte la valeur `null``
*
* <p><p>
* Note : sortie attendue
* <li>
* <ul>Start Level4/exercise2</ul>
* <ul>Value: Flash McQueen</ul>
* <ul>Stop</ul>
* </li>
* <p>
* Remarque : La méthode {@link Maybe#doOnSuccess} notifie le consommateur de la valeur émise.
*/
public static void exercise2() {
log.info("Start Level4/exercise2");
Maybe.just("The King")
.doOnSuccess(value -> log.info("Value: {}", value))
.doOnComplete(() -> log.info("Completed"))
.subscribe();
log.info("Stop");
}
/**
* Crée un {@link Maybe} vide.
*
* <p><p>
* Note : sortie attendue
* <li>
* <ul>Start Level4/exercise2</ul>
* <ul>Completed</ul>
* <ul>Stop</ul>
* </li>
* <p>
* Remarque : La méthode {@link Maybe#doOnComplete} notifie le consommateur de la fin du flux vide. Cette méthode
* est appelée seulement quand un {@link Maybe} est vide.
*/
public static void exercise3() {
log.info("Start Level4/exercise3");
Maybe.empty()
.subscribe(
name -> System.out.println("[B] Received " + name + " (not called)"),
Throwable::printStackTrace,
() -> System.out.println("[B] Completed")
);
.doOnSuccess(value -> log.info("Value: {}", value))
.doOnComplete(() -> log.info("Completed"))
.subscribe();
log.info("Stop");
}
/**
* Crée un {@link Completable} qui déclenche une action. Cette action n'émet pas de valeur.
*/
public static void exercise4() {
AtomicBoolean flag = new AtomicBoolean();
log.info("Start Level4/exercise4");
Completable.fromAction(() -> log.info("Action !"))
.doOnComplete(() -> log.info("Completed"))
.subscribe();
log.info("Stop");
}
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment