2017-11-21 1 views
3

Ich habe verschiedene Operatoren zum Iterieren von Objekten mit map, concatMap, all ausprobiert, aber ich kann das Element nicht aus meiner Liste entfernen.RxJava: Element aus der Liste entfernen

ist hier ein Stück Code:

Observable.fromIterable(selectedJobs) 
      .observeOn(AndroidSchedulers.mainThread()) // Added this from one answer in SO. but still no resolution. 
      .all(homeJob -> { 

       if (!homeJob.isCanCloseJob()) { 
        selectedJobs.remove(homeJob); // <- this is what causing Exception 
        //toast message 
       } else { 
        //do something 
       } 

       return true; 
      }) 
      .subscribe(new SingleObserver<Boolean>() { 
       @Override 
       public void onSubscribe(Disposable disposable) { 

       } 

       @Override 
       public void onSuccess(Boolean aBoolean) { 

        baseRealm.executeTransaction(realm -> realm.copyToRealmOrUpdate(selectedJobs)); 

       } 

       @Override 
       public void onError(Throwable throwable) { 
        AppLogger.e(tag, throwable.getMessage()); 
       // throws Caused by: java.util.ConcurrentModificationException 
       } 
      }); 

Alles, was ich will, ist für Zustand zu überprüfen, dann Objekt aus der Liste entfernen.

Antwort

2

In der funktionalen Programmierung arbeiten Sie mit Streams. Anstatt ein Element aus der ursprünglichen Eingabe zu entfernen, müssen Sie den Stream selbst filtern und die gefilterte Liste an den Consumer übergeben.

Scheint, wie das ist, was Sie suchen,:

Observable.fromIterable(listOfElements) 
      .filter(element -> { 
       if (element.isValid()) { 
        // do some action with valid `element` 
        // NOTE: this action would be performed with each valid element 
        return true; 
       } else { 
        // `element` is not valid, perform appropriate action 
        // NOTE: this action would be performed for each invalid element 
        return false; 
       } 
      }) 
      .toList() // collect all the filtered elements into a List 
      .subscribe(
        filteredElements -> /* use `filteredElements` which is List<Element> */, 
        throwable -> /* perform appropriate action with this `throwable`*/) 
     ); 
+0

Ich habe versucht, mit 'filter' Operator, aber ich wollte alle gefilterten Objekte und das ist, was Sie tun mit' ToList() 'Funktion, die zurückkehren gefilterte Liste in 'onSuccess'. Vielen Dank. Ich akzeptiere diese Antwort – Aks4125

Verwandte Themen