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

时间:2015-07-29 07:21:52

标签: java lambda functional-programming java-8 java-stream

是否有一种更好的功能方式来转换字符串数组,形式为" 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])));

1 个答案:

答案 0 :(得分:52)

您可以修改解决方案,将StreamString数组收集到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