使用Java 8 Lambda表达式将String数组转换为Map

是否有更好的function方式使用Java 8 lambda语法将“key:value”forms的字符串数组转换为Map

 Arrays.asList("a:1.0", "b:2.0", "c:3.0") .stream() .map(elem -> elem.split(":") .collect(Collectors.toMap(keyMapper?, valueMapper?)); 

我现在的解决方案似乎没有真正的function:

 Map kvs = new HashMap(); Arrays.asList("a:1.0", "b:2.0", "c:3.0") .stream() .map(elem -> elem.split(":")) .forEach(elem -> kvs.put(elem[0], Double.parseDouble(elem[1]))); 

您可以修改解决方案以将String of Stream数组收集到Map (而不是使用forEach ):

 Map kvs = Arrays.asList("a:1.0", "b:2.0", "c:3.0") .stream() .map(elem -> elem.split(":")) .collect(Collectors.toMap(e -> e[0], e -> Double.parseDouble(e[1])); 

当然,此解决方案无法防止无效输入。 也许您应该添加一个filter,以防分裂String没有分隔符:

 Map kvs = Arrays.asList("a:1.0", "b:2.0", "c:3.0") .stream() .map(elem -> elem.split(":")) .filter(elem -> elem.length==2) .collect(Collectors.toMap(e -> e[0], e -> Double.parseDouble(e[1])); 

这仍然无法保护您免受所有无效输入的影响(例如"c:3r"会导致parseDouble抛出NumberFormatException )。

部分答案,正在寻找改进:

 Stream.of("a:1.0", "b:2.0", "c:3.0") .map(...) ... 

使用流报告错误似乎很困难。

如果"a", 1.0允许"a", 1.0 ,则地图构建器可能会更加明显。