以下代码有效:
// 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;
}
});
我相信我对 map
和 flatMap
缺乏一些理解
在 Java 8 流中,我了解 map
和 flatMap
之间的区别(对于收到的每个项目,map
发出 1,flatMap
发出 N)
但是在 Reactor 中我有点困惑。我认为 map
和 flatMap
都会为接收到的每个元素发出 1 个项目,区别在于 map
将它作为 发出Mono
而 flatMap
则没有。要发出 N 个项目,我会使用 flatMapMany
。
预先感谢您的解释!
最佳答案
来自 Reactor java doc
map
:通过对其应用同步函数来转换此 Mono 发出的项目。
flatMap
:异步转换此 Mono 发出的项目,返回另一个 Mono 发出的值。
在所有情况下,您都不能返回null
。它只是被设计禁止的。 map
和 flatMap
之间的主要区别是第二个返回一个 Mono。这允许对数据库、Web 服务等执行异步调用。
所以 flatMap
应该用来执行另一个异步操作。如果你返回一个 Mono.just(...)
就不是很有用了。我们可能会像您一样使用 flatMap 在某些情况下返回 Mono.empty()
。这是一个常见的模式。根据您的用例,您可能更喜欢使用 filter
或 mapNotNull
。
这里是一个替代代码,用于发出一个带有条件的新对象:
.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/