2015-03-28 4 views
0

Я все еще изучаю RxJava, и я хотел знать, есть ли другой способ делать то, что я хочу.Лучшее использование RxJava

У меня есть следующий код, и она работает:

apiManager.getChannelListByRegion(region) 
      .observeOn(scheduler) 
      .map(new Func1<ChannelList, List<ChannelList.Channel>>() { 
       @Override 
       public List<ChannelList.Channel> call(ChannelList channelList) { 

        if (params.getGenre() == 0) { 
         return channelList.getChannels(); 
        } else { 
         List<ChannelList.Channel> filteredList = new ArrayList<>(); 
         for (ChannelList.Channel channel : channelList.getChannels()) { 
          if (Integer.parseInt(channel.getGenreId()) == params.getGenre()) 
           filteredList.add(channel); 
         } 
         return filteredList; 
        } 
       } 
      }) 
      .subscribe(new SuccessCallback<>(callback), new ErrorCallback(callback)); 

Некоторые explanantion - The Channellist является POJO, представляющий некоторую JSon от внешней службы. Я не контролирую структуру этого JSon.

ChannelList содержит встроенный список, который я хочу, и я могу получить его через оператор map() довольно легко, не допуская фильтрацию списка.

Если мне нужно фильтровать, я прибег к петле над его содержимым и проверил условие фильтрации.

Есть ли способ лучше фильтровать? Я предполагаю, что мне нужно создать другое Observable, которое испускает содержимое List и предоставляет функцию, но я не уверен, как это сделать.

ответ

1

Я могу показать вам, как переписать код, используя только FP и reactivex. Это скорее вопрос вкуса, если он проще. Я буду использовать lambdas, чтобы сделать код более понятным.

apiManager.getChannelListByRegion(region) 
       .observeOn(scheduler) 
       .flatMap(channelList->Observable.from(channelList.getChannels())) 
       .filter(channel->params.getGenre() == 0 || Integer.parseInt(channel.getGenreId()) == params.getGenre()) 
       .toList() 
       .subscribe(new SuccessCallback<>(callback), new ErrorCallback(callback)); 

Как вы можете видеть, я сначала конвертирую ChannelList в Observable of Channel, чтобы позже фильтровать его и собирать в виде списка.

+0

все равно доходит до меня, как решение очевидно, когда вы его видите, но я действительно изо всех сил пытался туда добраться! – FinalFive

+0

Вы можете использовать 'concatMap' вместо' flatMap', если имеет значение порядок вывода. 'flatMap' не гарантирует, что вывод каждого преобразованного Observable не будет чередоваться. Если заказ не является проблемой, значит, 'flatMap', вероятно, немного эффективнее. – lopar

Смежные вопросы