2016-06-29 5 views
1

Я хочу найти 1-й элемент в списке, соответствующий равенству. :RxJava Predicate Filter

1 Casting его подтип

class EditorialBlock extends Block 

2 фильтра элемента

3 возвращает первый элемент в противном случае, если не найден обратный нуль.

Обычно я пишу это как

EditorialBlock findBlockByID(final List<Block> contentBlocks, final String identifier) { 
    for (Block block : contentBlocks) { 
     EditorialBlock item = (EditorialBlock) block; // 1 casting 
     if (identifier.equals(item.getIdentifier())) { // 2 filter 
      return item; // 3 return the first element 
     } 
    } 

    return null; 
} 

Как это может написана с RxJava? Вы можете также разлагать 4 шага: 0 итерации, 1 Кастинг, 2 фильтра, 3 Return первого элемента или нуль

Примечание: Я был поклонником Predicate гуавы в. Чтобы снизить количество dex в моих приложениях для Android, я собираюсь заменить RxJava на Предикаты Guava, если это возможно.

ответ

1

Это должно работать, Обратите внимание, что я использовал лямбда-выражение, которое требует Java 8.

EditorialBlock findBlockByID(final List<Block> contentBlocks, final String identifier) { 
    return Observable.from(contentBlocks) 
      .cast(EditorialBlock.class) 
      .filter(x -> x.getIdentifier().equals(identifier)) 
      .toBlocking() 
      .firstOrDefault(null); 
} 

.cast() делает отливки.

.filter() выполняет фильтрацию

.firstOrDefault (нуль) является ваша третья точка.

Итерирование происходит глубже в коде.