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;
}
});
添加回答
举报