5 回答
TA贡献1862条经验 获得超7个赞
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 ...
});
TA贡献1799条经验 获得超6个赞
这是因为flatMap将尝试将内部单声道展开到外部单声道中。这意味着该值将为空,但会有一个类型。
另一方面map将变换Mono<A>为Mono<B>。null 没有类型,这就是为什么你不能这样做。
TA贡献1802条经验 获得超10个赞
使用map方法映射内容时Mono,不能提供null作为映射结果,因为这会导致 java.lang.NullPointerException: The mapper returned a null value.订阅期间出现错误。
可以Mono为空,也可以包含有效的对象。
根据Project Reactor的源代码,a的内容Mono不能为null。
因此,在这种情况下,有效的解决方案是使用flatMap.
TA贡献1876条经验 获得超7个赞
流中的任何位置null都会抛出NPE: Mapper returned a null value. 不管map还是flatMap。这是设计使然。
关于 的简短说明flatMap:它急切地订阅其内部流(在您的情况下为Mono.empty()或Mono.just(..)),并在内部流不断发出元素时进行动态合并。这就是为什么您可以通过 保证订单flatMap。
TA贡献1865条经验 获得超7个赞
为了避免您的情况出现 NullPointerException,您可以将 map 更改为 mapNotNull:
.mapNotNull(myBoolean -> {
if (myBoolean) {
return null;
}
else {
return employee;
}
});
添加回答
举报
