Java 8 , değerlerden biri 'null' ise bir Collectors.toMapatar NullPointerException. Bu davranışı anlamıyorum, haritalar değer olarak boş göstericiler içerebilir sorunsuz. Değerlerin boş kalmamasının iyi bir nedeni var mı Collectors.toMap?
Ayrıca, bunu düzeltmek için güzel bir Java 8 yolu var mı, yoksa döngü için düz eski haline dönmeli miyim?
Sorunuma bir örnek:
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));
}
}
Yığın izleme:
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)
Bu sorun hala Java 11'de bulunmaktadır.
nullbir anahtar için sorun olabilir, ancak bu durumda değerdir.
null, HashMapbiri olabilir örnek için nullanahtar ve herhangi bir sayıda nulldeğerlerinin, bir özel oluşturmayı deneyebilirsiniz Collectorkullanarak HashMapyerine varsayılan birini kullanarak.
HashMap- stacktrace öğesinin ilk satırında gösterildiği gibidir. Sorun, bir değeri Maptutamayacağı değil null, Map#mergefonksiyonun ikinci argümanının boş olamayacağıdır.
nullTreeMap'teki gibi her zaman biraz sorunluydu. Belki denemek için güzel bir anOptional<Boolean>? Aksi takdirde ayırın ve filtre kullanın.