Rx java 如何收集可观测数据<;结果集>;绘制

Rx java 如何收集可观测数据<;结果集>;绘制,rx-java,vert.x,Rx Java,Vert.x,我正试图从Vertex AsyncSqlClient收集一个可观察的 到HashMap Map<String, Integer> map = Maps.newHashMap(); asyncSQLClient .getConnectionObservable() .flatMap(sqlConnection -> sqlConnection.queryObservable("select a, b from table")

我正试图从Vertex AsyncSqlClient收集一个
可观察的

到HashMap

Map<String, Integer> map = Maps.newHashMap();
asyncSQLClient
        .getConnectionObservable()
        .flatMap(sqlConnection -> sqlConnection.queryObservable("select a, b from table")
                .doOnCompleted(sqlConnection::close)
                .doOnError(throwable -> log.error("Error while querying.", throwable)))
        .flatMap(resultSet -> Observable.from(resultSet.getRows()))
        .toBlocking()
        .forEach(row -> map.put(row.getString("a"), row.getInteger("b")));
Map Map=Maps.newHashMap();
asyncSQLClient
.getConnectionObservable()
.flatMap(sqlConnection->sqlConnection.queryObservable(“从表中选择a、b”)
.doOnCompleted(sqlConnection::close)
.doon错误(throwable->log.error(“查询时出错。”,throwable)))
.flatMap(resultSet->Observable.from(resultSet.getRows()))
.toBlocking()
.forEach(row->map.put(row.getString(“a”)、row.getInteger(“b”));
但这似乎永远无法实现


在搜索了一段时间后,没有任何结果,你介意帮我一把吗?

正如@Phoenix Wang评论的那样,
forEach()
方法。这意味着,如果您有发出无限项的
Observable
,或者您有一个不正确地发出
onCompleted
信号的Observable complete,它将永远被阻塞

这可能是由于您的
getConnectionObservable()
方法实现造成的,如果它使用
Observable.create()
创建一个自定义的
Observable
,例如,您必须在发出所有项后调用
onCompleted()

无论如何,您应该知道,
toBlocking()
将阻塞并等待,这可能不适用于生产代码(因为它破坏了反应性的所有目的),您可以使用
reduce()
实现相同的目的:

注意,您仍然需要解决
onCompleted
问题,因为reduce还需要
Observable
完成,并在source
Observable
完成时发出信号项。

另外一个选项是使用
scan()
(只是用scan替换reduce),通过scan,您将获得每个发射的项目的发射,并且源
是可观测的
,这意味着您将随着时间累积要映射的项目。

您的团队中是否调用了onComplete?toBlocking()需要这样做。你能详细说明一下吗?是否可以使用
single
操作符将可观察对象的“长度”限制为1?要在第一个元素之后发出可观察对象已完成的信号?否,因为single()也将等待完成(或等待第二次发射,然后抛出IllegalArgumentException,不过,您可以使用first()你会得到第一次发射,不管以后会发生什么,但在我看来,它就像一个创可贴解决方案,你可以发布你的<代码> GETCONTIONECTION 代码,如果你需要帮助来解决它。
@yosriz我正在使用io.vertx.rxjava.ext.asyncsql.AsyncSQLClient获取第一个可观察的
 asyncSQLClient
            .getConnectionObservable()
            .flatMap(sqlConnection -> sqlConnection.queryObservable("select a, b from table")
                    .doOnCompleted(sqlConnection::close)
                    .doOnError(throwable -> log.error("Error while querying.", throwable)))
            .flatMap(resultSet -> Observable.from(resultSet.getRows()))
            .reduce(Maps.newHashMap(), (map, o) -> map.put(row.getString("a"), row.getInteger("b")))
            .subscribe(map -> {
                        //do something with map
                    }
            );