我试图把它变成一个Observable而不需要外部变量或额外的类。这可能吗?这是一个基本的搜索列表:
//...
for(int i = 0; i < items.size(); i++) {
if(items.get(i).id == findId) return i;
}
return -1;
所以基本上我有一个字符串id,如果我发现我想在“items”列表中返回项目索引。
答案 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);