gpt4 book ai didi

java - 在 RxJava 的 .flatMap() 运算符中处理两种不同类型

转载 作者:行者123 更新时间:2023-12-02 02:14:09 29 4
gpt4 key购买 nike

我正在编写的应用程序使用 Retrofit 执行初始 API 调用,该调用返回 URL。该响应是 .flatMap根据 URL 中包含的文本进入另一个 API 调用。但是,两个辅助 API 调用被定义为返回不同的响应模型。

为了让事情更清楚,这里有一些代码:

APIService service = retrofit.create(APIService.class);

service.getURL() // returns response model containing a URL.
.flatMap(new Function<GetURLResponse, ObservableSource<?>>() {
@Override
public ObservableSource<?> apply(GetURLResponse getURLResponse) throws Exception {

// Determine whether the returned url is for "first.com".
if (getURLResponse.url.contains("first.com")) {
return service.first(getURLResponse.url);
}

// Otherwise, the URL is not for "first.com", so use our other service method.
return service.second(getURLResponse.url);
}
})

以下是 service.first() 的接口(interface)定义和service.second() :

@GET                                                                                    
Observable<retrofit2.Response<ResponseBody>> first(@Url String url);

@GET
Observable<SecondModel> second(@Url String url);

如何更好地处理流的其余部分的这两种不同的可能类型( retrofit2.Response<ResponseBody>SecondModel )?例如。如果初始 URL 包含 first.com然后service.first() API 调用应该触发,下游运算符(operator)应该收到 retrofit2.Response<ResponseBody> 。相反,如果初始 URL 不包含 first.comservice.second() API 调用应该触发,并且流下游的运算符(operator)应该收到 SecondModel .

最佳答案

最简单的方法是让两个模型类实现一个接口(interface)并返回该接口(interface),或者模型都可以扩展一个抽象类来实现相同的效果。然后,您将执行 instanceOf 检查以查看它是哪个模型,并继续您首选的转换。

话虽如此,您提到了下游运营商,但我认为这会导致大量烦人的检查。因此,我要做的就是使用 publish 运算符拆分流,然后将进一步的转换应用于每个子流。最后,您应该将两个流合并在一起并返回包含这两个模型的单个模型。

下面是一个代码示例,可帮助您入门。

Observable<Integer> fooObservableSecondaryRequest(String foo) {
return Observable.just(1);
}
Observable<Integer> booObservableSecondaryRequest(String boo) {
return Observable.just(2);
}
Observable<String> stringObservable = Observable.just("foo", "boo");

stringObservable.publish(shared -> Observable.merge(
shared.filter(a -> a.equals("foo"))
.flatMap(fooString -> fooObservableSecondaryRequest(fooString))
.map(num -> num * 2),
shared.filter(a -> a.equals("boo"))
.flatMap(booString -> booObservableSecondaryRequest(booString))
.map(num -> num * 10)
)).subscribe(result -> System.out.println(result)); // will print 2 and 20

关于java - 在 RxJava 的 .flatMap() 运算符中处理两种不同类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49541548/

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