RxJava搜索列表

时间:2016-09-06 04:19:05

标签: rx-java observable

我试图把它变成一个Observable而不需要外部变量或额外的类。这可能吗?这是一个基本的搜索列表:

    //...
    for(int i = 0; i < items.size(); i++) {
        if(items.get(i).id == findId) return i;
    }
    return -1;

所以基本上我有一个字符串id,如果我发现我想在“items”列表中返回项目索引。

3 个答案:

答案 0 :(得分:6)

在没有额外遍历开销的情况下执行此操作的一种“整洁”方式如下:

  Observable<Integer> index = Observable.from(items)
            .takeWhile(item -> item.id != findId)
            .count()
            .map(count -> count == data.size() ? -1 : count);

但是我会坚持使用非Rx方法来处理这种简单的用例

答案 1 :(得分:2)

一种方法是使用fromCallable方法创建Observable

Observable.fromCallable(() -> {
            for(int i = 0; i < items.size(); i++) {
                if(items.get(i).id == findId) return i;
            }
            return -1;
        });

或更多声明性方法:

Observable.from(items)
                .filter(item -> item.id == findId)
                .map(items::indexOf);

答案 2 :(得分:1)

我知道这是一个古老的问题,但也许有人会使用helper class派上用场。这是一种更加灵活,一致和声明式的方法。支持任何有限的Observable。示例:

Single<Integer> result = Observable.fromIterable(items)
            .as(IndexedValue.firstMatch(next -> next.id == findId))
            .map(IndexedValue::index)
            .toSingle(-1);