Collectors.toMap membuang NullPointerException apabila salah satu nilai adalah nol. Tingkah laku ini mengejutkan kerana peta boleh mengandungi nilai nol tanpa sebarang masalah. Mengapakah sekatan ini dikenakan untuk Collectors.toMap?
Sebab sekatan ini ialah Collectors.toMap menggunakan HashMap secara dalaman. HashMaps tidak membenarkan nilai nol untuk kunci, tetapi ia membenarkan nilai nol untuk nilai. Walau bagaimanapun, Collectors.toMap menganggap bahawa semua nilai adalah bukan nol, dan ia membuang NullPointerException jika andaian ini dilanggar.
Java 8 tidak menyediakan cara yang baik untuk menyelesaikan masalah ini. Anda boleh sama ada kembali kepada gelung lama biasa atau gunakan penyelesaian seperti di bawah:
Map<Integer, Boolean> collect = list.stream() .collect(HashMap::new, (m,v)->m.put(v.getId(), v.getAnswer()), HashMap::putAll);
Penyelesaian ini menggunakan pembina HashMap yang mengambil pembekal sebagai hujah. Pembekal digunakan untuk membuat contoh peta baharu jika strim kosong. Dalam kes ini, pembekal mencipta HashMap baharu dengan kapasiti lalai 16 dan faktor beban 0.75.
Penyelesaian kemudian menggunakan kaedah putAll untuk menambah semua elemen daripada strim ke peta. Kaedah putAll menggabungkan elemen daripada strim ke dalam peta, menggantikan mana-mana elemen sedia ada dengan kunci yang sama.
Penyelesaian ini tidak sebersih kaedah Collectors.toMap, tetapi ia berfungsi. Ia juga mengekalkan susunan unsur dalam strim, yang tidak dilakukan oleh Collectors.toMap.
Atas ialah kandungan terperinci Mengapa Collectors.toMap Melemparkan NullPointerException Apabila Nilainya Nol?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!