使用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
,则地图构建器可能会更加明显。