Java 8 Collectors.toMapmelempar a NullPointerExceptionjika salah satu nilainya adalah 'nol'. Saya tidak mengerti perilaku ini, peta dapat berisi pointer nol sebagai nilai tanpa masalah. Apakah ada alasan bagus mengapa nilai tidak dapat null Collectors.toMap?
Juga, apakah ada cara Java 8 yang bagus untuk memperbaikinya, atau haruskah saya kembali ke polos lama untuk loop?
Contoh masalah saya:
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
class Answer {
private int id;
private Boolean answer;
Answer() {
}
Answer(int id, Boolean answer) {
this.id = id;
this.answer = answer;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Boolean getAnswer() {
return answer;
}
public void setAnswer(Boolean answer) {
this.answer = answer;
}
}
public class Main {
public static void main(String[] args) {
List<Answer> answerList = new ArrayList<>();
answerList.add(new Answer(1, true));
answerList.add(new Answer(2, true));
answerList.add(new Answer(3, null));
Map<Integer, Boolean> answerMap =
answerList
.stream()
.collect(Collectors.toMap(Answer::getId, Answer::getAnswer));
}
}
Stacktrace:
Exception in thread "main" java.lang.NullPointerException
at java.util.HashMap.merge(HashMap.java:1216)
at java.util.stream.Collectors.lambda$toMap$168(Collectors.java:1320)
at java.util.stream.Collectors$$Lambda$5/1528902577.accept(Unknown Source)
at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1359)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:512)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:502)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
at Main.main(Main.java:48)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Masalah ini masih ada di Jawa 11.
nullbisa menjadi masalah untuk kunci, tetapi dalam hal ini nilainya.
null, HashMapmisalnya dapat memiliki satu nullkunci dan sejumlah nullnilai, Anda dapat mencoba membuat custom Collectormenggunakan HashMapalih - alih menggunakan yang default.
HashMap- seperti yang ditunjukkan pada baris pertama stacktrace. Masalahnya bukan bahwa tidak Mapdapat menyimpan nullnilai, tetapi argumen Map#mergefungsi kedua tidak boleh nol.
nullselalu sedikit bermasalah, seperti di TreeMap. Mungkin saat yang tepat untuk mencobaOptional<Boolean>? Kalau tidak, bagi dan gunakan filter.