2017-09-24 7 views
0

Le scénario consiste à mettre à jour les modèles de données dans une liste en fonction d'un nombre entier de Set.Comment mettre à jour un modèle de données basé sur un ensemble de valeurs

Par exemple, un ArrayList ayant:

Student { 
    name: "abc", 
    id: 1, 
    hasPassed: false 
}... 

Maintenant, j'ai un ensemble de Entiers qui a essentiellement ID d'étudiants à l'intérieur {1, 2, ...} dénotant ID étudiants des étudiants passaient.

Je reçois le arrayList de Student à l'intérieur d'un onNext Méthode de mon observer.

Comment mettre à jour le champ hasPassed d'objet (s) d'étudiant (s) basé sur les ID d'étudiant que je reçois de l'entier Set? J'essaye d'employer RxJava2 pour faire ceci.

Répondre

1

Vous pouvez commencer par itérer les élèves en utilisant flatmapIterable() oberator qui émettra les éléments un par un, puis vous pouvez utiliser flatmap() pour appliquer une opération sur l'élément émis, enfin si vous voulez votre liste utilisez retour opérateur toList() .. il peut ressemble à quelque chose comme

Observable.fromIterable(studentList) //emit items one by one 
    .flatMap(studentItem -> { //make an operation on item 
     if (ids.contains(studentItem.getId())) { 
     studentItem.setHasPassed(true); 
     } 
     return Observable.just(studentItem); //emit item 
    }) 
    .toList() //get all items on a list 
    .subscribe(finalList->{ 
     //handle the result 
     }, throwable -> { 
     //handlle error 
    }); 
+0

cool! Je ne sais pas pourquoi, mais je reçois une erreur "déclaration manquante" près du '});' ai-je oublié quelque chose ici? – beerBear

+1

Je vais mettre à jour la réponse –

+0

toujours la même erreur à '}). ToList(). Subscribe (' pour une instruction de retour manquante dans '}}' – beerBear

1

Même si la réponse de Mohamed est acceptable, il n'y a pas besoin d'utiliser flatMap, parce que vous ne voulez pas convertir un élément en flux d'éléments, mais juste convertir l'élément en un autre élément. Ainsi, une meilleure solution serait d'utiliser map opérateur:

Observable.fromIterable(list) 
      .map(student -> { 
       if (getPassedIds().contains(student.getId())) { 
        return new Student(student.getId(), student.getName(), true); 
       } else { 
        return student; 
       } 
      }) 
      .toList() 
      .subscribe(students -> students.forEach(student -> logd(student.toString())), 
        throwable -> { //handle error}); 

Dans mon exemple, je une classe immuable, de sorte que vous ne devez pas réutiliser le même utilisateur, mais vous créer un autre utilisateur ayant les mêmes propriétés, à l'exception le hasPassed booléen: l'immuabilité a beaucoup d'avantages et c'est une bonne idée d'utiliser des classes immuables quand c'est possible.