如何过滤第二个Observable?

时间:2015-04-07 16:09:46

标签: rx-java

说我有Observable<String> names;

然后是第二个Observable<String> bannedNames;

是否可以使用不在禁止观察中的names进行过滤?

目前我正在将禁止的名称转换为列表然后执行包含;

names.filter(n -> !bannedNamesList.contains(n));

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

几乎就在那里我说。你真的应该把被禁止的名字放入HashSet而不是List中以提高效率。使用rxjava以惯用方式执行此操作有点繁琐且不易读取,可能看起来像这样:

Observable<String> names = Observable.just("fred", "dave", "sal");
Observable<Set<String>> banned = Observable.just("sal", "joe")
            .toList()
            .map(list -> new HashSet<String>(list))
            .cache();
Observable<String> okNames = 
        names.flatMap(name -> 
                        banned.exists(set -> set.contains(name))
                              .filter(b -> !b)
                              .map(b -> name));

因此,我说更好的方法是使用HashSet而不是列表,而不是使用惯用的rxjava解决方案。