【发布时间】:2015-08-07 15:12:39
【问题描述】:
对于我的 android 应用,我需要一个 Observable 来聚合来自 7 个不同搜索的结果并作为单个集合发出。
- 对于最终的发射,我选择了
ListMultimap<Content, SearchResult>,其中Content是搜索结果类型的枚举,SearchResult是用于显示搜索结果的视图模型界面。
这是我的做法,但是否有我不知道的 RxJava 运算符可以做得更干净?
public Observable<ListMultimap<Content, SearchResult>> getSearchResults(final CharSequence charSequence) {
return Observable.just(charSequence)
.map(new Func1<CharSequence, ListMultimap<Content, SearchResult>>() {
@Override
public ListMultimap<Content, SearchResult> call(CharSequence charSequence) {
final String searchTerm = charSequence.toString();
final ListMultimap<Content, SearchResult> data =
MultimapBuilder.enumKeys(Content.class)
.arrayListValues()
.build();
for (SearchResult searchResult : SearchBookmarkableRepoImpl.this.getSectionPageSearchResults(searchTerm).toBlocking().first())
data.put(Content.SECTION_PAGE, searchResult);
for (SearchResult searchResult : SearchBookmarkableRepoImpl.this.getAppendixPageSearchResults(searchTerm).toBlocking().first())
data.put(Content.APPENDIX_PAGE, searchResult);
for (SearchResult searchResult : SearchBookmarkableRepoImpl.this.getImageSearchResults(searchTerm, ImageType.FIGURE).toBlocking().first())
data.put(Content.FIGURE, searchResult);
for (SearchResult searchResult : SearchBookmarkableRepoImpl.this.getImageSearchResults(searchTerm, ImageType.TABLE).toBlocking().first())
data.put(Content.TABLE, searchResult);
for (SearchResult searchResult : SearchBookmarkableRepoImpl.this.getImageSearchResults(searchTerm, ImageType.FORM).toBlocking().first())
data.put(Content.FORM, searchResult);
for (SearchResult searchResult : SearchBookmarkableRepoImpl.this.getGlossarySearchResults(searchTerm, GlossaryType.ACRONYMS).toBlocking().first())
data.put(Content.ACRONYM, searchResult);
for (SearchResult searchResult : SearchBookmarkableRepoImpl.this.getGlossarySearchResults(searchTerm, GlossaryType.DEFINITIONS).toBlocking().first())
data.put(Content.DEFINITION, searchResult);
return data;
}
});
}
这是 7 种搜索方法之一的示例方法签名。每个都返回一个 Observable<List<SearchResult>> 如果 RxJava 有更好的方法来做到这一点,我可以将它们作为单独的 SearchResult 而不是 List<> 发出
Observable<List<SearchResult>> getSectionPageSearchResults(final String searchWord)
【问题讨论】:
标签: java android system.reactive rx-java