2017-09-18 3 views
0

J'ai une liste des célibataires booléennes que je veux convertir en peut-être de la manière suivante:RxJava simple: flatMap si elle est fausse

Passez par chaque émission de la liste dans l'ordre, si l'émission en amont est faux flatMapMaybe à Maybe.never() mais si l'émission est vraie abonnez-vous au prochain single dans la liste jusqu'à ce que la liste soit vide.

Voici ce que j'ai jusqu'à présent:

private void subscribeIfAllTrue(List<Single<Boolean>> singles) { 

    if (singles.isEmpty()) { 
     return; 
    } 
    Single.concat(blockingSingles) 
      .flatMapMaybe(
        (Function<Boolean, MaybeSource<Boolean>>) shouldProgress -> { 
         if (shouldProgress) { 
          // flatMap to next single in list. 
          // if last in list then Maybe.just(true) 
         } else { 
          Maybe.never(); 
          // break from list 
         } 
        } 
} 

Cela ne fonctionne évidemment pas puisque nous souscrivons à tous les célibataires via concat mais ce n'est pas le comportement que je veux. Vous vous demandez s'il y avait un opérateur rx à break; et arrêtez de vous abonner à partir de la liste des abonnements si une émission est fausse, aussi quand last in last retourne juste Maybe.just(true). Était à la recherche

La raison principale pour laquelle je ne veux pas abonner à tous les célibataires est que l'émission booléenne en amont effectue un changement d'ui qui, si l'un est faux, ne veut pas déclencher le changement d'ui en se cassant.

Répondre

0

Peut-être utiliser takeUntil (et peut-être, lastElement()) pour le motif désiré.

Mayble<Boolean> m = Single.concat(blockingSingles) 
    .takeUntil(bool -> !bool) 
    .lastElement()