使用Java 8 Lambda表达式将字符串数组转换为映射

使用Java 8 Lambda表达式将字符串数组转换为映射,java,lambda,functional-programming,java-8,java-stream,Java,Lambda,Functional Programming,Java 8,Java Stream,使用Java8Lambda语法将“key:value”形式的字符串数组转换为Map是否有更好的功能方法 Arrays.asList("a:1.0", "b:2.0", "c:3.0") .stream() .map(elem -> elem.split(":") .collect(Collectors.toMap(keyMapper?, valueMapper?)); 我现在的解决方案似乎没有真正发挥作用: Map<String, D

使用Java8Lambda语法将“key:value”形式的字符串数组转换为
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])));
Map kvs=new HashMap();
数组.asList(“a:1.0”、“b:2.0”、“c:3.0”)
.stream()
.map(元素->元素拆分(“:”)
.forEach(elem->kvs.put(elem[0],Double.parseDouble(elem[1]));

您可以修改您的解决方案,将
字符串
数组的
收集到
映射
(而不是使用
forEach
):

映射kvs=
数组.asList(“a:1.0”、“b:2.0”、“c:3.0”)
.stream()
.map(元素->元素拆分(“:”)
.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])));
映射kvs=
数组.asList(“a:1.0”、“b:2.0”、“c:3.0”)
.stream()
.map(元素->元素拆分(“:”)
.filter(元素->元素长度==2)
.collect(Collectors.toMap(e->e[0],e->Double.parseDouble(e[1]));

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

我不认为默默忽略错误输入是一个好建议,这不是OP要求的。我最好使用
elem->elem.split(“:”,2)
而不是添加
过滤器
步骤。这样,错误输入将通过
ArrayIndexOutOfBoundsException
(如果未找到冒号)或
NumberFormatException
(如果找到多个冒号)显示。感谢所有关于错误检查的评论和额外输入。这就是我所需要的。如果任务是将实际数组转换为映射,则表达式应以
数组.stream()
@Vlad.Bachurin开头。它还可用于当前代码-
数组.asList().stream()…
Arrays.asList(“a:1.0”、“b:2.0”、“c:3.0”)
部分是从问题中原样取出来的。@Eran我明白你的意思,但是
Arrays.stream()
还是比较短。更符合问题的主题。和平.)
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])));