当前位置: 首页 > 面试题库 >

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

阴波峻
2023-03-14
问题内容

有没有更好的功能方法,可以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])));

问题答案:

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



 类似资料:
  • 我正在尝试执行以下操作(cb=CriteriaBuilder): 但我得到以下语法错误: 绑定不匹配:(表达式之间的泛型方法 是否可以转换表达式

  • 问题内容: 我有一个Swift程序,可以与C库互操作。这个C库返回一个内部带有数组的结构,如下所示: 该定义已正确导入到Swift中。但是,该字段被解释为8个元素(类型为)的 元组 ,我不知道如何使用Swift 将其转换为a 。 没有可以接受元组的初始化程序,并且似乎不可能获得指向元组的第一个元素的指针(因为类型可以是异构的,这并不奇怪)。 现在,我最好的主意是创建一个微型C函数,该函数接受指向结

  • 我试图将js代码转换为java版本,但对正则表达式有点困惑:在js中,我有一个类似于:testString的表达式。拆分(“/(\w*\d)/g”) 我可以在java中使用什么等效语言?我试着用匹配器得到同样的结果。find()和split函数,但结果不一样。

  • 我有个方法 所以本质上是这样的: exec(这里的一些java魔术将str3转换为string[],然后将这个string[]传递给这个exec方法本身);

  • 使用Java 8 lambda语法将“key:value”形式的字符串数组转换为是否有更好的功能方法? 我现在的解决方案似乎并不实用: