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

以下代码有效:


// emitting employees...

.flatMap(employee -> {


    boolean isAlive = employee.isAlive();


    return Mono.just(isAlive)


            .flatMap(myBoolean -> {

                if (myBoolean) {

                    return Mono.empty();

                } 

                else {

                    return Mono.just(employee);

                }

            });


})

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


            .map(myBoolean -> {

                if (myBoolean) {

                    return null;

                } 

                else {

                    return employee;

                }

            });

map我相信我对两者缺乏一些了解flatMap


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


但在 Reactor 中我有点困惑。我认为 和map都会为收到的每个元素flatMap发出 1 个项目,区别在于 和 会map暂时不发出它。要发出 N 个项目,我会使用.MonoflatMapflatMapMany


预先感谢您的解释!


三国纷争
浏览 150回答 5
5回答

牧羊人nacy

map:通过对其应用同步函数来转换此 Mono 发出的项目。flatMap:异步转换此 Mono 发出的项,返回另一个 Mono 发出的值。在所有情况下,您都无法返回null。这是设计上禁止的。map和之间的主要区别flatMap是第二个返回 Mono。这允许对数据库、Web 服务等执行异步调用。因此flatMap应该用于执行其他异步操作。如果你返回一个Mono.just(...). Mono.empty()我们可能会像您一样使用 flatMap 在某些情况下返回。这是一种常见的模式。根据您的用例,您可能更喜欢使用filter或mapNotNull。这里有一个替代代码,用于发出带有条件的新对象:      .handle(myBoolean, sink -> {            if (!myBoolean) {                sink.next(employee);            } // else the Mono would be empty ...        });

哈士奇WWW

这是因为flatMap将尝试将内部单声道展开到外部单声道中。这意味着该值将为空,但会有一个类型。另一方面map将变换Mono<A>为Mono<B>。null 没有类型,这就是为什么你不能这样做。

守候你守候我

使用map方法映射内容时Mono,不能提供null作为映射结果,因为这会导致&nbsp;java.lang.NullPointerException: The mapper returned a null value.订阅期间出现错误。可以Mono为空,也可以包含有效的对象。根据Project Reactor的源代码,a的内容Mono不能为null。因此,在这种情况下,有效的解决方案是使用flatMap.

幕布斯6054654

流中的任何位置null都会抛出NPE: Mapper returned a null value.&nbsp;不管map还是flatMap。这是设计使然。关于 的简短说明flatMap:它急切地订阅其内部流(在您的情况下为Mono.empty()或Mono.just(..)),并在内部流不断发出元素时进行动态合并。这就是为什么您可以通过 保证订单flatMap。

莫回无

为了避免您的情况出现 NullPointerException,您可以将 map 更改为 mapNotNull:&nbsp; &nbsp; &nbsp; &nbsp; .mapNotNull(myBoolean -> {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (myBoolean) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return null;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return employee;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; });&nbsp;
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java