是否有一种更好的功能方式来转换字符串数组,形式为" key:value"使用Java 8 lambda语法到Map
?
Arrays.asList("a:1.0", "b:2.0", "c:3.0")
.stream()
.map(elem -> elem.split(":")
.collect(Collectors.toMap(keyMapper?, valueMapper?));
我现在所拥有的解决方案似乎并不实用:
Map<String, Double> 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])));
答案 0 :(得分:52)
您可以修改解决方案,将Stream
个String
数组收集到Map
(而不是使用forEach
):
Map<String, Double> 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]));
当然,此解决方案无法防止无效输入。也许您应该添加一个过滤器,以防分裂字符串没有分隔符:
Map<String, Double> 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"
会导致NumberFormatException
抛出parseDouble
。