Java 8将Map <string,string [] =“”>转换为Map <string,string>

时间:2016-05-19 15:45:43

标签: java dictionary lambda java-8 java-stream

更新(在标记为重复的问题之后):重复的问题/答案无法帮助我解决我的问题,因为我得到的地图来自外部来源。

我正在尝试使用Java streamcollect功能来解决问题。

我有一张Map<String, String[]>的地图,我需要将其转换为Map<String, String>,如果它不为空,则需要拾取String数组的第一个元素,如果不是null则为null它是emptyprivate 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

我在这里做错了什么想法?

0 个答案:

没有答案