亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 .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 關注
  • 251 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號