2017-04-13 4 views
0

Alors, voici mon code:analyse syntaxique d'une liste Rx Java Realmlist

@Override 
public RealmList<RealmStuff> call(List<Stuff> stuff) { 
    return Observable.from(stuff) 
      .map(this::getRealmStuff) 
      .toList() 
      .toBlocking() 
      .first(); 
} 

Ce qui est bien. Cependant, je veux obtenir un RealmList. Comment puis-je y parvenir? Est-ce que je devrais aller avec un flatmap et juste aller avec un oldschool pour chacun et ajouter l'article un par un au nouveau RealmList?

Peut-être quelque chose comme ceci:

.map(realmStuff -> new RealmList<>(realmStuff.toArray(new RealStuff[realmStuff.size()]))) 

Mais cela semble fou pour moi ... Ou est-ce juste moi?

+3

Eh bien, si le but de la méthode est simplement de convertir 'List' en' RealmList', je ne vois aucun avantage à utiliser l'approche réactive. – Lamorak

+2

Habituellement, lorsque vous utilisez Rx, vous passez dans Observable à travers toute la chaîne pour bénéficier de la nature asynchrone et orientée push. Si tout ce que vous voulez faire est d'effectuer des calculs en série ou en parallèle, vous pouvez consulter [Java 8 Streams] (http://www.oracle.com/technetwork/articles/java/ma14-java-se-8-streams-2177646). html). – andreim

+3

RxJava n'est pas un Api de flux, il ne devrait pas être utilisé comme ça. Règle de base: si vous utilisez toBlocking() dans la chaîne rx, vous faites probablement quelque chose de mal. – Than

Répondre

1

Si vous voulez vraiment utiliser RxJava pour cela, vous pouvez faire à l'aide de l'opérateur collect:

//pseudocode 
Observable.from(stuff) 
    .collect(() -> { 
      return new RealmList(); //list initialization 
     }, (realmList, stuffItem) -> { 
      realmList.add(stuffItem); //adding each item to list 
     } 
    ).blockingGet() 

Mais l'approche réactive est ici redondant, il suffit d'utiliser une boucle régulière forEach.