Rumah  >  Artikel  >  Java  >  Mengapa Collectors.toMap Melemparkan NullPointerException dengan Nilai Kemasukan Null?

Mengapa Collectors.toMap Melemparkan NullPointerException dengan Nilai Kemasukan Null?

Linda Hamilton
Linda Hamiltonasal
2024-11-11 21:44:03350semak imbas

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

NullPointerException Ditemui dalam Collectors.toMap with Null Entry Values

Pengenalan

Di Java 8 , Collectors.toMap ialah kaedah mudah untuk mencipta Peta daripada aliran pasangan kunci-nilai. Walau bagaimanapun, kaedah ini membuang NullPointerException jika salah satu nilai dalam aliran adalah batal. Ini kelihatan aneh, memandangkan Peta boleh mengandungi nilai nol tanpa sebarang isu.

Sebab Pengecualian Null

Sebab di sebalik gelagat ini ialah pelaksanaan lalai Pengumpul. toMap menggunakan HashMap sebagai struktur data asas. HashMaps tidak membenarkan nilai nol untuk kunci, tetapi ia membenarkan nilai nol untuk nilai. Walau bagaimanapun, apabila Collectors.toMap menemui nilai null untuk kunci, ia cuba menggunakan nilai lalai untuk nilai (iaitu null), dan ini menghasilkan NullPointerException.

Java 8 Solution

Untuk menyelesaikan isu ini dalam Java 8, kami boleh menggunakan penyelesaian yang melibatkan pembuatan HashMap dan mengisinya dengan pasangan nilai kunci daripada strim:

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

Penyelesaian ini tidak begitu elegan, tetapi ia akan menghasilkan hasil yang dijangkakan: Peta yang mengandungi pasangan nilai kunci daripada strim, dengan nol nilai untuk sebarang kunci yang mempunyai nilai nol dalam strim.

Pertimbangan

Adalah penting untuk ambil perhatian bahawa penyelesaian ini mempunyai pertimbangan berikut:

  • Tidak seperti Collectors.toMap, ia akan menggantikan nilai secara senyap jika anda mempunyai kunci yang sama beberapa kali.
  • Ia menggunakan HashMap sebagai struktur data asas, yang mungkin tidak sesuai untuk semua senario.

Jika pertimbangan ini tidak boleh diterima untuk kes penggunaan anda, anda mungkin perlu mempertimbangkan pendekatan alternatif, seperti menggunakan pelaksanaan Pemungut yang berbeza atau berbalik kepada gelung lama biasa.

Atas ialah kandungan terperinci Mengapa Collectors.toMap Melemparkan NullPointerException dengan Nilai Kemasukan Null?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn