यदि कोई मान 'शून्य' है, तो जावा 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
एक कुंजी के लिए एक समस्या हो सकती है, लेकिन इस मामले में यह मूल्य है।
null
, HashMap
उदाहरण के लिए एक हो सकता है null
कुंजी और के किसी भी संख्या null
मूल्यों, आप एक कस्टम बनाने की कोशिश कर सकते Collector
का उपयोग कर एक HashMap
के बजाय डिफ़ॉल्ट एक का उपयोग कर।
HashMap
- जैसा कि स्टैकट्रेस की पहली पंक्ति में दिखाया गया है। समस्या यह नहीं है कि मूल्य Map
नहीं रखा जा सकता है null
, लेकिन यह कि Map#merge
फ़ंक्शन का दूसरा तर्क शून्य नहीं हो सकता है।
null
हमेशा की तरह थोड़ा सा समस्याग्रस्त था, जैसे कि TreeMap। शायद एक अच्छा पल बाहर की कोशिश करने के लिएOptional<Boolean>
? अन्यथा विभाजन और फ़िल्टर का उपयोग करें।