首页 > 解决方案 > 使用 Java 流将字符串列表转换为映射列表

问题描述

我有以下模式的字符串列表

String test ="name=john,age=28;name=paul,age=30;name=adam,age=50";
List<String> listOfStrings = Arrays.asList(test.split(";"));

我想将上面的字符串列表转换为键值对映射列表(如下所示)。

[{name=john, age=28}, {name=paul, age=30}, {name=adam, age=50}]

上面的每个条目都列出了一个映射,其中键作为名称和年龄,值作为它们的对应值。

这就是我为达到这个结果所做的。

listOfStrings.stream()
  .map(record -> Arrays.asList(record.split(",")).stream().map(field -> field.split("="))
  .collect(Collectors.toMap(keyValue -> keyValue[0].trim(), keyValue -> keyValue[1].trim())))
  .collect(Collectors.toList());

我想知道这是否有效,或者是否有更好的方法来使用 Java 流。

标签: javajava-8java-stream

解决方案


这是另一种使用模式匹配的替代方法,它不如 for 循环快,但比我测量的原始流解决方案快得多。

public static void main(String[] args) {
    String test ="name=john,age=28;name=paul,age=30;name=adam,age=50";
    String patternString = "(name)=(\\w*),(age)=(\\d*)[;]?";
    Pattern pattern = Pattern.compile(patternString);
    Matcher matcher = pattern.matcher(test);
    List<Map<String, String>> list = new ArrayList<>();

    while (matcher.find()) {
        Map<String, String> map = new HashMap<>();
        map.put(matcher.group(1), matcher.group(2));
        map.put(matcher.group(3), matcher.group(4));
        list.add(map);
    }
}

通过不匹配键(姓名和年龄),而是在创建地图元素时对它们进行硬编码,可以稍微提高性能。


推荐阅读