为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

三国纷争 2023-09-20 15:51:42
以下代码有效:// 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我相信我对两者缺乏一些了解flatMapmap在Java 8流中,我理解和之间的区别flatMap(对于收到的每个项目,map发出 1,flatMap发出 N)但在 Reactor 中我有点困惑。我认为 和map都会为收到的每个元素flatMap发出 1 个项目,区别在于 和 会map暂时不发出它。要发出 N 个项目,我会使用.MonoflatMapflatMapMany预先感谢您的解释!
查看完整描述

5 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

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

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

在所有情况下,您都无法返回null。这是设计上禁止的。map和之间的主要区别flatMap是第二个返回 Mono。这允许对数据库、Web 服务等执行异步调用。

因此flatMap应该用于执行其他异步操作。如果你返回一个Mono.just(...)Mono.empty()我们可能会像您一样使用 flatMap 在某些情况下返回。这是一种常见的模式。根据您的用例,您可能更喜欢使用filtermapNotNull

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

      .handle(myBoolean, sink -> {

            if (!myBoolean) {

                sink.next(employee);

            } // else the Mono would be empty ...

        });


查看完整回答
反对 回复 2023-09-20
?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

这是因为flatMap将尝试将内部单声道展开到外部单声道中。这意味着该值将为空,但会有一个类型。

另一方面map将变换Mono<A>Mono<B>。null 没有类型,这就是为什么你不能这样做。


查看完整回答
反对 回复 2023-09-20
?
守候你守候我

TA贡献1802条经验 获得超10个赞

使用map方法映射内容时Mono,不能提供null作为映射结果,因为这会导致 java.lang.NullPointerException: The mapper returned a null value.订阅期间出现错误。

可以Mono为空,也可以包含有效的对象。

根据Project Reactor的源代码,a的内容Mono不能为null。

因此,在这种情况下,有效的解决方案是使用flatMap.


查看完整回答
反对 回复 2023-09-20
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

流中的任何位置null都会抛出NPE: Mapper returned a null value. 不管map还是flatMap。这是设计使然。

关于 的简短说明flatMap:它急切地订阅其内部流(在您的情况下为Mono.empty()Mono.just(..)),并在内部流不断发出元素时进行动态合并。这就是为什么您可以通过 保证订单flatMap


查看完整回答
反对 回复 2023-09-20
?
莫回无

TA贡献1865条经验 获得超7个赞

为了避免您的情况出现 NullPointerException,您可以将 map 更改为 mapNotNull:


        .mapNotNull(myBoolean -> {

            if (myBoolean) {

                return null;

            } 

            else {

                return employee;

            }

        }); 


查看完整回答
反对 回复 2023-09-20
  • 5 回答
  • 0 关注
  • 88 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信