當其中一個值為 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中文網其他相關文章!