首頁 >Java >java教程 >為什麼 Collectors.toMap 會拋出帶有 Null 條目值的 NullPointerException?

為什麼 Collectors.toMap 會拋出帶有 Null 條目值的 NullPointerException?

Linda Hamilton
Linda Hamilton原創
2024-11-11 21:44:03428瀏覽

Why Does Collectors.toMap Throw a NullPointerException with Null Entry Values?

Collectors.toMap 中遇到空條目值的NullPointerException

簡介

在Java 8 中, Collectors.toMap 是一種從流建立Map的便捷方法鍵值對。但是,如果流中的值之一為 null,則此方法將引發 NullPointerException。這看起來很奇怪,因為 Maps 可以毫無問題地包含 null 值。

空異常的原因

此行為背後的原因是 Collectors 的預設實作。 toMap 使用 HashMap 作為底層資料結構。 HashMap 不允許鍵為空值,但它們允許值為空值。但是,當 Collectors.toMap 遇到鍵的 null 值時,它會嘗試使用該值的預設值(即 null),這會導致 NullPointerException。

Java 8 解決方案

要在 Java 8 中解決此問題,我們可以使用解決方法,其中涉及手動建立 HashMap並使用鍵值對填充它來自流:

Map<Integer, Boolean> collect = list.stream()
        .collect(HashMap::new, (m,v)->m.put(v.getId(), v.getAnswer()), HashMap::putAll);

此解決方法不是特別優雅,但它會產生預期的結果:包含來自流的鍵值對的Map,任何具有null 值的鍵都具有null值

注意事項

請務必注意,此解決方法具有以下內容注意事項:

  • 與Collectors.toMap 不同,如果多次使用相同的鍵,它會默默地替換值。
  • 它使用 HashMap 作為底層資料結構,這可能不是適合所有場景。

如果這些注意事項對於您的用例來說是不可接受的,您可能需要考慮替代方法,例如使用不同的 Collector 實作或還原到普通的舊 for 迴圈。

以上是為什麼 Collectors.toMap 會拋出帶有 Null 條目值的 NullPointerException?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn