RxJava 搜索列表中的项目

RxJava search for item in list

我试图在没有外部变量或额外的情况下将它变成一个 Observable 类。这可能吗?这是通过列表进行的基本搜索:

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

所以基本上我有一个字符串 ID,如果我发现我想 return "items" 列表中的项目索引。

一种方法是使用 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);

一种 "neat" 无需额外遍历开销的方法如下:

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

但对于这种简单的用例,我会坚持使用非 Rx 方法

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

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