首頁 >Java >java教程 >為什麼當值為 Null 時 Collectors.toMap 會拋出 NullPointerException?

為什麼當值為 Null 時 Collectors.toMap 會拋出 NullPointerException?

Susan Sarandon
Susan Sarandon原創
2024-11-10 15:32:03534瀏覽

Why Does Collectors.toMap Throw a NullPointerException When Values Are Null?

Collectors.toMap 中具有 Null 條目值的 NullPointerException

當其中一個值為 null 時,Collectors.toMap 會引發 NullPointerException。這種行為令人驚訝,因為映射可以包含空值而不會出現任何問題。為什麼 Collectors.toMap 有此限制?

此限制的原因是 Collectors.toMap 內部使用了 HashMap。 HashMap 不允許鍵為空值,但允許值為空值。但是,Collectors.toMap 假設所有值都是非空的,如果違反此假設,它會拋出 NullPointerException。

Java 8 沒有提供解決此問題的好方法。您可以恢復為普通的舊 for 循環,也可以使用如下所示的解決方法:

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

此解決方法使用將供應商作為參數的 HashMap 建構子。如果流為空,則供應商用於建立新的地圖實例。在這種情況下,供應商會建立一個新的 HashMap,預設容量為 16,負載因子為 0.75。

然後,解決方法使用 putAll 方法將流中的所有元素新增至映射中。 putAll 方法將流中的元素合併到映射中,用相同的鍵取代任何現有元素。

此解決方法不如 Collectors.toMap 方法乾淨,但它有效。它還保留流中元素的順序,而 Collectors.toMap 則不這樣做。

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

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