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值
注意事項
請務必注意,此解決方法具有以下內容注意事項:
如果這些注意事項對於您的用例來說是不可接受的,您可能需要考慮替代方法,例如使用不同的 Collector 實作或還原到普通的舊 for 迴圈。
以上是為什麼 Collectors.toMap 會拋出帶有 Null 條目值的 NullPointerException?的詳細內容。更多資訊請關注PHP中文網其他相關文章!