RxJava 谓词过滤器

RxJava Predicate Filter

我想在匹配相等的列表中找到第一个元素。 :

1 转换为其子类型

class EditorialBlock extends Block

2 筛选元素

3 return 第一个元素否则如果没有找到 return null.

一般我会写成

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 第一个元素或 null

注意:我是 Guava 谓词的粉丝。为了降低我的 Android 应用程序中的 dex 计数,如果可能的话,我将用 Guava 的 Predicates 替换 RxJava。

这应该可以,请注意,我使用了一个需要 Java 8.

的 lambda 表达式
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(null) 是您的第三点。

迭代发生在代码的更深处。