更新(在标记为重复的问题之后):重复的问题/答案无法帮助我解决我的问题,因为我得到的地图来自外部来源。
我正在尝试使用Java stream
和collect
功能来解决问题。
我有一张Map<String, String[]>
的地图,我需要将其转换为Map<String, String>
,如果它不为空,则需要拾取String
数组的第一个元素,如果不是null
则为null
它是empty
或private Map<String, String> convertMyMap(Map<String, String[]> originalMap) {
return originalMap.entrySet().stream().collect(
Collectors.toMap(
e -> e.getKey(),
e -> {
if (ArrayUtils.isNotEmpty(e.getValue()))
return e.getValue()[0];
return null;
}
));
Map<String, String[]> params = new HashMap<String, String[]>();
params.put("test", new String[]{"1"});
params.put("test1", new String[]{"2", "1"});
//params.put("test2", new String[]{}); // THIS THROWS NPE
//params.put("test3", null); // THIS THROWS NPE
convertMyMap(params).forEach((key, value) -> System.out.println(key + " "+ value));
我使用下面的代码来测试它
Exception in thread "main" java.lang.NullPointerException
at java.util.HashMap.merge(Unknown Source)
at java.util.stream.Collectors.lambda$toMap$172(Unknown Source)
at java.util.stream.ReduceOps$3ReducingSink.accept(Unknown Source)
at java.util.HashMap$EntrySpliterator.forEachRemaining(Unknown Source)
at java.util.stream.AbstractPipeline.copyInto(Unknown Source)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown Source)
at java.util.stream.AbstractPipeline.evaluate(Unknown Source)
at java.util.stream.ReferencePipeline.collect(Unknown Source)
正如您所看到的那样,当我尝试使用空数组或原始地图的空值时,它会抛出NPE。
--summarize
我在这里做错了什么想法?