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;
}
});
添加回答
舉報