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);
我试图在没有外部变量或额外的情况下将它变成一个 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);