java - 在 .map() 中返回 null 与在 Reactor 中返回 .flatMap()

标签 java reactor

以下代码有效:

// emitting employees...
.flatMap(employee -> {

    boolean isAlive = employee.isAlive();

    return Mono.just(isAlive)

            .flatMap(myBoolean -> {
                if (myBoolean) {
                    return Mono.empty();
                } 
                else {
                    return Mono.just(employee);
                }
            });

})

但我想知道为什么我不能在处理 myBoolean 时使用 .map(返回 null 时出现 NullPointerException)

            .map(myBoolean -> {
                if (myBoolean) {
                    return null;
                } 
                else {
                    return employee;
                }
            });

我相信我对 mapflatMap 缺乏一些理解

在 Java 8 流中,我了解 mapflatMap 之间的区别(对于收到的每个项目,map 发出 1,flatMap 发出 N)

但是在 Reactor 中我有点困惑。我认为 mapflatMap 都会为接收到的每个元素发出 1 个项目,区别在于 map 将它作为 发出MonoflatMap 则没有。要发出 N 个项目,我会使用 flatMapMany

预先感谢您的解释!

最佳答案

来自 Reactor java doc

map:通过对其应用同步函数来转换此 Mono 发出的项目。

flatMap:异步转换此 Mono 发出的项目,返回另一个 Mono 发出的值。

在所有情况下,您都不能返回null。它只是被设计禁止的。 mapflatMap 之间的主要区别是第二个返回一个 Mono。这允许对数据库、Web 服务等执行异步调用。

所以 flatMap 应该用来执行另一个异步操作。如果你返回一个 Mono.just(...) 就不是很有用了。我们可能会像您一样使用 flatMap 在某些情况下返回 Mono.empty()。这是一个常见的模式。根据您的用例,您可能更喜欢使用 filtermapNotNull

这里是一个替代代码,用于发出一个带有条件的新对象:

        .handle(myBoolean, sink -> {
            if (!myBoolean) {
                sink.next(employee);
            } // else the Mono would be empty ...
        });

关于java - 在 .map() 中返回 null 与在 Reactor 中返回 .flatMap(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58215810/

相关文章:

java - Spring MVC :- How do i get the uploaded image to display on jsp page as soon as the user selects the image. 我在这里使用Spring框架

java - react 堆模式如何与线程一起工作

java - Vert.x:最简单的 1000 rps 服务器

java - spring mvc 为所有 Controller 提供一个初始化绑定(bind)器

java - 如何在较大的表达式中匹配除冒号之外的任何字符(包括特殊字符)的字符串(前面没有反斜杠)?

java - 使用递增的查询参数重复 WebClient 调用

python - 如何停止 pymodbus 异步 ModbusTcpServer?

ace - 如何在 ace 中结束 react 器事件循环

java - 地址重用在新的 Java 运行时环境中不起作用

java - 合并几乎相等的数据列表的值