java - 使用过滤器和 Map 链接 Java Reactor Mono

标签 java dictionary filter chaining reactor

我正在尝试调用多个服务(使用 Java Reactor),一个服务的输出将决定是否应该调用下一个服务。

  1. 通过调用 validateSession API 验证 session 是否有效
  2. 检查 session 是否有效以及是否有关联的登录信息
  3. 获取登录详细信息
  4. 检查登录详细信息中是否包含名字
  5. 如果以上全部通过,则生成凭据

线路

.filter(details -> details != null && StringUtils.isNotBlank(details.getFName))

给出错误,因为“details”被解释为 Mono。

如果我更改代码以使用 flatMap 而不是 Map,它可以正常工作,但我需要同步响应,因为我需要等待一切完成才能生成凭据。

.map(session -> dao.getDetails(session.getLogin()))
                .filter(details -> details != null && StringUtils.isNotBlank(details.getFName))

下面是有问题的代码。

Mono<Credentials> response = dao.validateSession(sessionId)
                .filter(session -> session != null && StringUtils.isNotBlank(session.getLogin()))
                .map(session -> dao.getDetails(session.getLogin()))
                .filter(details -> details != null && StringUtils.isNotBlank(details.getFName))
                .map(details -> dao.generateCredentials())
                .cast(Credentials.class);

最佳答案

你可以这样简化:

Mono<Credentials> response = dao.validateSession(sessionId)
                .filter(session -> StringUtils.isNotBlank(session.getLogin()))
                .flatMap(session -> dao.getDetails(session.getLogin()))
                .filter(details -> StringUtils.isNotBlank(details.getFName))
                .flatMap(details -> dao.generateCredentials());

我更改了用于简化的运算符,但我认为最后一步需要将 details 对象用作 generateCredentials 方法的参数。

关于java - 使用过滤器和 Map 链接 Java Reactor Mono,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57217832/

相关文章:

javascript - 谷歌地图错误标记获取事件属性

php - 如何过滤 doctrine2 实体中的 setter/getter ?

ruby - 在Ruby中,过滤一个对象中所有包含单词 "time"的方法的好方法是什么?

java - 如何在另一个项目中导入包含 AspectJ 方面和注释的项目

Java 8 列表到 map 的转换

c++ - 包含按值对映射进行排序的键的 vector

javascript - 过滤嵌套对象数组

java - 在java中使用纸张扫描仪需要哪些库?

java - 移动 Zip 文件 (Android Studio Java)

c++ - 双哈希函数返回错误值