如果其中一个值为'null' ,Java 8 Collectors.toMap将抛出一个NullPointerException.我不明白这种行为,map可以包含null指针作为值而没有任何问题.有没有一个很好的理由为什么值不能为空Collectors.toMap?
另外,是否有一个很好的Java 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 …Run Code Online (Sandbox Code Playgroud) 我读过这个话题:
但我不明白如何将其应用于我的问题:
我的代码:
Map<String, List<MappingEntry>> mappingEntryMap = mapping.getMappingEntries()
.stream()
.collect(Collectors.groupingBy(MappingEntry::getMilestone, Collectors.mapping(e -> e, Collectors.toList())));
Run Code Online (Sandbox Code Playgroud)
对我来说MappingEntry::getMilestone有时可以返回null.这对我的情况没问题,但我看到:
Caused by: java.lang.NullPointerException: element cannot be mapped to a null key
at java.util.Objects.requireNonNull(Objects.java:228)
at java.util.stream.Collectors.lambda$groupingBy$45(Collectors.java:907)
at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
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)
Run Code Online (Sandbox Code Playgroud)
我怎样才能避免这种异常?
因此,我还是Java 8的新手,仍在努力将流API与传统的迭代和集合相关联。
因此,我有一个具有3个属性的对象“ UserData”的列表,该列表都是非规范化数据。
public class UserData {
private String primaryAccountNumber;
private String subAccountNumber;
private String currency;
}
Run Code Online (Sandbox Code Playgroud)
样本输入数据将像
PrimaryAccNumber SubAccNumber Currency
PA00 US00 USD
PA01 US01 USD
PA01 US02 USD
PA02 EU00 EUR
PA03 EU01 EUR
PA04 CA00 CAD
PA04 CA01 CAD
null IN00 INR
null IN01 INR
Run Code Online (Sandbox Code Playgroud)
预期的输出应该是这样的
USD -> PA00 -> [US00]
PA01 -> [US01,US02]
EUR -> PA02 -> [EU00]
-> PA03 -> [EU01]
CAD -> PA04 -> [CA00,CA01]
INR -> null (or dummykey)->[IN00,IN01]
Run Code Online (Sandbox Code Playgroud)
因此,我希望以某种方式对它进行规范化,以使输出结果是一个以货币为键的映射,而值应为另一个以主Acc和键与子帐户列表的值为键的映射。
Map<String, Map<String,List<String>>> …Run Code Online (Sandbox Code Playgroud)