【问题标题】:Convert String array to Map using Java 8 Lambda expressions使用 Java 8 Lambda 表达式将字符串数组转换为 Map
【发布时间】:2015-10-20 00:58:11
【问题描述】:

有没有更好的函数式方法可以使用 Java 8 lambda 语法将“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])));

【问题讨论】:

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


    【解决方案1】:

    您可以修改您的解决方案以将String 数组中的Stream 收集到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" 会导致NumberFormatExceptionparseDouble 抛出)。

    【讨论】:

    • 我不认为默默地忽略错误输入是一个好建议,这不是 OP 要求的。我最好使用elem -&gt; elem.split(":", 2) 而不是添加filter 步骤。这样,错误输入将通过ArrayIndexOutOfBoundsException(如果未找到冒号)或NumberFormatException(如果找到多个冒号)显示。
    • 感谢所有 cmets 和对错误检查的额外输入。这正是我所需要的。
    • 如果任务是将 real 数组转换为 Map,则表达式应以 Arrays.stream(&lt;arrayVariable&gt;) 开头
    • @Vlad.Bachurin 它也适用于当前代码 - Arrays.asList(&lt;arrayVariable&gt;).stream()...Arrays.asList("a:1.0", "b:2.0", "c:3.0") 部分按原样取自问题。
    • @Eran 我明白你的意思,但Arrays.stream(&lt;array&gt;) 无论如何都更短。并且更适合问题的主题。和平。 :)
    猜你喜欢
    • 2017-08-30
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多