一尘不染

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

java

有没有更好的功能方法,可以Map使用Java 8 lambda语法将“ key:value”形式的字符串数组转换为a ?

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])));

阅读 2998

收藏
2020-09-26

共1个答案

一尘不染

您可以修改解决方案以将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)。

2020-09-26