gpt4 book ai didi

java - 我如何将来自不同 observable 的 rx.Observable 搜索结果合并到一个 Observable 中?

转载 作者:行者123 更新时间:2023-11-30 01:58:09 28 4
gpt4 key购买 nike

对于我的 Android 应用程序,我需要一个 Observable 来聚合来自 7 个不同搜索的结果并作为一个集合发出。

  • 对于最终发射,我选择了 ListMultimap<Content, SearchResult>其中 Content是搜索结果类型的枚举,SearchResult是用于显示搜索结果的 View 模型界面。

我是这样做的,但是有没有我不知道的 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)

最佳答案

让我们一步一步来。

为了使其更通用,假设您有一个对象 (=SearchResult) 和一个名为 anEnum 的枚举 (=Content)。

我已经将 ArrayListMultimap 用于具体实现,我以前没有使用过它,所以如果有更好的方法向它添加对象,请使用。

第一步:map Observable<List<Object>>Observable<ArrayListMultimap<anEnum, Object>>

    private Observable<ArrayListMultimap<anEnum, Object>> getMultiListSectionPageSearchResults(final String searchWord, anEnum anEnum) {
return getSectionPageSearchResults(searchWord).map(objects -> {
ArrayListMultimap<anEnum, Object> newList = ArrayListMultimap.create();
for (Object o : objects) {
newList.put(anEnum, o);
}
return newList;
});
}

现在您已拥有所需格式的列表。

第二步:为所有数据创建可观察对象,假设您有 4 个

    Observable<ArrayListMultimap<anEnum, Object>> multiList1 = getMultiListSectionPageSearchResults("one", anEnum.ONE);
Observable<ArrayListMultimap<anEnum, Object>> multiList2 = getMultiListSectionPageSearchResults("two", anEnum.TWO);
Observable<ArrayListMultimap<anEnum, Object>> multiList3 = getMultiListSectionPageSearchResults("three", anEnum.THREE);
Observable<ArrayListMultimap<anEnum, Object>> multiList4 = getMultiListSectionPageSearchResults("four", anEnum.FOUR);

第三步:merge它们到一个流中(如果顺序对你很重要,你也可以使用 concat 到)

        Observable<ArrayListMultimap<anEnum, Object>> mergedLists = Observable.merge(
multiList1, multiList2, multiList3, multiList4);

第四步:reduce他们到一个列表中,我们将使用第一个列表作为将包含所有内容的列表

        Observable<ArrayListMultimap<anEnum, Object>> oneList = mergedLists.reduce((l1, l2) -> {
for (anEnum c : l2.keySet()) {
for (Object o : l2.get(c)) {
l1.put(c, o);
}
}
return l1;
});

最后一步:使用数据,single()只是为了确保我们真正得到一个列表

oneList.single().subscribe(this::doSomething);

在哪里做某事:private void doSomething(ArrayListMultimap<anEnum, Object> list)

如果您使用常规列表,转换会容易得多,因为已经有方法可以为您做到这一点,例如 l1.addAll(l2)减少

关于java - 我如何将来自不同 observable 的 rx.Observable 搜索结果合并到一个 Observable 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31881141/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com