2017-02-13 4 views
2

Я пытаюсь отфильтровать список с RxJava2 таким образом, чтобы каждый элемент (объект) в списке должен пройти проверку проверки, и я получаю результирующий список только с тегами, которые проходят этот тест. Например, если мой объект имел следующую структуру,Список фильтров RxJava2 <Object>

class MyClassA { 
    int value1; 
    int value2; 
} 

Я хочу только получить список элементов, где value2 10.

У меня есть функции API вызова, который возвращает наблюдаемый из списка, т.е. Observable<List<MyClassA>> следующим образом,

apiService.getListObservable() 
    .subscribeOn(Schedulers.io) 
    .observeOn(AndroidSchedulers.mainThread()); 

, и я хотел бы иметь выход фильтруется, поэтому я попытался добавить .filter() оператора выше, но это, кажется, требует Predicate<List<MyClassA>> вместо просто MyClassA объект, с которым я могу проверить и разрешить только те, где value2 == 10.

Я довольно новичок в RxJava и RxJava2 и кажется, что у меня что-то отсутствует здесь?

ТИА

ответ

14

Вы можете разворачивать список, а затем собрать до тех записей, которые прошли фильтр:

apiService.getListObservable() 
.subscribeOn(Schedulers.io) 
.flatMapIterable(new Function<List<MyClassA>, List<MyClassA>>() { 
    @Override public List<MyClassA> apply(List<MyClassA> v) { 
     return v; 
    } 
}) 
.filter(new Predicate<MyClassA>() { 
    @Override public boolean test(MyClassA v) { 
     return v.value2 == 10; 
    } 
}) 
.toList() 
.observeOn(AndroidSchedulers.mainThread()) 
.subscribe(...); 
+0

не могли бы вы расширить код ambda до pre Java 8? действительно поможет увидеть это так – Bootstrapper

+0

Не работает с текучим –

0

Вы можете посмотреть на ниже. Он демонстрирует способы печати только отфильтрованных объектов или списков, содержащих отфильтрованные объекты. Здесь логика фильтрации состоит в том, чтобы сохранить org.apache.commons.lang3.tuple.Pair s, у которых есть четные числа справа.

public static void main(String[] args) { 
    // print raw output 
    getListObservable().subscribe(System.out::println); 

    // print the objects post filtering 
    getListObservable().flatMap(v -> Observable.from(v)).filter(p -> p.getRight()%2==0).subscribe(System.out::println); 

    // print the list refined with only filtered objects 
    getListObservable().flatMap(v -> Observable.just(v.stream().filter(p -> p.getRight()%2==0).collect(Collectors.toList()))).subscribe(System.out::println); 

} 

private static Observable<List<Pair<Integer, Integer>>> getListObservable() { 
    return Observable.create(subscriber -> { 
     for(int i=0; i<5; i++){ 
      List<Pair<Integer, Integer>> list = new ArrayList<>(); 
      for(int j=0; j<5; j++){ 
       list.add(Pair.of(i, j)); 
      } 
      subscriber.onNext(list); 
     } 
    }); 

} 

Вывод с содержанием наблюдаемой:

[(0,0), (0,1), (0,2), (0,3), (0,4)] 
[(1,0), (1,1), (1,2), (1,3), (1,4)] 
[(2,0), (2,1), (2,2), (2,3), (2,4)] 
[(3,0), (3,1), (3,2), (3,3), (3,4)] 
[(4,0), (4,1), (4,2), (4,3), (4,4)] 

Выход, чтобы содержать только отфильтрованные объекты:

(0,0) 
(0,2) 
(0,4) 
(1,0) 
(1,2) 
(1,4) 
(2,0) 
(2,2) 
(2,4) 
(3,0) 
(3,2) 
(3,4) 
(4,0) 
(4,2) 
(4,4) 

Выход содержать списки, которые содержат только отфильтрованные объекты.

[(0,0), (0,2), (0,4)] 
[(1,0), (1,2), (1,4)] 
[(2,0), (2,2), (2,4)] 
[(3,0), (3,2), (3,4)] 
[(4,0), (4,2), (4,4)] 
Смежные вопросы