Java 8 Collectors.toMap
melempar a NullPointerException
jika 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.
null
bisa menjadi masalah untuk kunci, tetapi dalam hal ini nilainya.
null
, HashMap
misalnya dapat memiliki satu null
kunci dan sejumlah null
nilai, Anda dapat mencoba membuat custom Collector
menggunakan HashMap
alih - alih menggunakan yang default.
HashMap
- seperti yang ditunjukkan pada baris pertama stacktrace. Masalahnya bukan bahwa tidak Map
dapat menyimpan null
nilai, tetapi argumen Map#merge
fungsi kedua tidak boleh nol.
null
selalu sedikit bermasalah, seperti di TreeMap. Mungkin saat yang tepat untuk mencobaOptional<Boolean>
? Kalau tidak, bagi dan gunakan filter.