RxJava谓词过滤器

时间:2016-06-29 08:28:28

标签: java rx-java predicate

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

1投射到其子类型

class EditorialBlock extends Block

2过滤元素

3返回第一个元素,否则如果没有找到则返回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个返回第一个元素或者空白

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

1 个答案:

答案 0 :(得分:1)

这应该有效,请注意我使用了一个需要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)是你的第三点。

迭代在代码中发生得更深。