避免RxJava中的toblock

避免RxJava中的toblock,java,rx-java,observable,Java,Rx Java,Observable,为了简洁起见,我发现下面的代码进行了修改,这是有缺陷的,据我所知,它有缺陷 它使用toblock,这在一般情况下是不推荐的,并且已经在被动上下文中使用 它返回单个;因此,一旦它从流中获得单个项,它就会终止它,忽略不需要的其余项。 虽然我相信我可以解决这个问题,但把单曲移到最后?有人能解释一下,我怎样才能取消Toblock的使用 您可以使用flatMap或concatMap替换map+ToBlock: 每当你想使用map+Toblock时,你都需要flatMap。也可以用from替换+flatMa

为了简洁起见,我发现下面的代码进行了修改,这是有缺陷的,据我所知,它有缺陷

它使用toblock,这在一般情况下是不推荐的,并且已经在被动上下文中使用 它返回单个;因此,一旦它从流中获得单个项,它就会终止它,忽略不需要的其余项。 虽然我相信我可以解决这个问题,但把单曲移到最后?有人能解释一下,我怎样才能取消Toblock的使用


您可以使用flatMap或concatMap替换map+ToBlock:


每当你想使用map+Toblock时,你都需要flatMap。也可以用from替换+flatMapfrom。谢谢,我相信我的思路是正确的,但我的问题是当我用.flatMapresp->{return resp}替换map+toblock时;我得到编译错误。在某个地方我犯了一个幼稚的错误,你能解释一下这没有任何影响吗:?代码不会处理任何错误,而且它会创建一个可观察对象并立即将其丢弃。
observableList.map(incentiveDetailsList -> {
        List<SomeObject> list = mapThisList(incentiveDetailsList);
        return Observable.just(list)
                    .flatMap(Observable::from)
                    .flatMap(item -> {
                        Request request = createRequest(item);
                        String accountNumber = item.getAccountNumber();
                        return serviceThatReturnsObservable.load(request)
                                .doOnError(onError -> {
                                    Observable.error(new Exception("some context"));
                                })
                                .map(response -> {
                                    handleError(response);
                                    return responseMap.put(accountNumber, buildResponse(response.getResponse()));
                                });
                    })
                    .map(resp -> mapResponse(store, incentiveDetailsList, responseMap))
                    .toBlocking()
                    .single();
})
 observableList.flatMap(incentiveDetailsList -> {
    List<SomeObject> list = mapThisList(incentiveDetailsList);
    return Observable.from(list)
           .flatMap(item -> {
               Request request = createRequest(item);
               String accountNumber = item.getAccountNumber();
               return serviceThatReturnsObservable.load(request)
                   /* this has no effect:
                            .doOnError(onError -> {
                                Observable.error(new Exception("some context"));
                            })
                    */
                    .map(response -> {
                         handleError(response);
                         return responseMap.put(accountNumber, 
                            buildResponse(response.getResponse()));
                    });
            })
            .map(resp -> mapResponse(store, incentiveDetailsList, responseMap));
})