জাভা 8 টি Collectors.toMap
নম্বরের NullPointerException
মানগুলির একটি হলে নিক্ষেপ করে। আমি এই আচরণটি বুঝতে পারি না, মানচিত্রে কোনও সমস্যা ছাড়াই মান হিসাবে নাল পয়েন্টার থাকতে পারে। মানগুলি কেন বাতিল হতে পারে না এমন কোনও কারণ আছে Collectors.toMap
?
এছাড়াও, এটি ঠিক করার কোনও দুর্দান্ত জাভা 8 উপায় আছে, বা লুপের জন্য আমার পুরানো প্লেইনে ফিরে যেতে হবে?
আমার সমস্যার উদাহরণ:
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));
}
}
ক্ষেত্রে স্টেকট্র্যাস:
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)
এই সমস্যাটি এখনও জাভা 11 এ বিদ্যমান।
null
কোনও কীটির জন্য সমস্যা হতে পারে তবে এই ক্ষেত্রে এটির মান the
null
, HashMap
উদাহরণস্বরূপ এক হতে পারে null
কী এবং যে কোন সংখ্যার null
মান, আপনি একটি কাস্টম তৈরি করার চেষ্টা করতে পারেন Collector
ব্যবহার করে একটি HashMap
পরিবর্তে ডিফল্ট ব্যবহার।
HashMap
প্রথম লাইনে প্রদর্শিত। সমস্যাটি এমন নয় যে একটি মান Map
ধরে রাখতে পারে না null
, তবে Map#merge
ফাংশনের দ্বিতীয় যুক্তিটি বাতিল হতে পারে না।
null
TreeMap এর মতো সর্বদা কিছুটা সমস্যাযুক্ত ছিল। চেষ্টা করার জন্য একটি সুন্দর মুহূর্ত হতে পারেOptional<Boolean>
? অন্যথায় বিভক্ত এবং ফিল্টার ব্যবহার করুন।