java - 使用 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 流。
解决方案
这是另一种使用模式匹配的替代方法,它不如 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);
}
}
通过不匹配键(姓名和年龄),而是在创建地图元素时对它们进行硬编码,可以稍微提高性能。
推荐阅读
- python - Python Pyinstaller GUI Tkinter Selenium
- javascript - 使用 Javascript 按钮显示
- bash - 如何打印 unix 命令行工具的所有可能命令?
- python - pandas 如何存储使用`drop_duplicates`删除的行?
- unity3d - 程序集引用了不存在的程序集“Unity.PerformanceTesting”
- regex - 用于分隔折叠标题的正则表达式
- python - 从python目录访问文本文件
- java - 运行应用程序抛出 android.support.v7.app.AppCompatActivity 但使用“扩展活动”有效
- java - 我不清楚这些方向
- javascript - 动态生成 javascript 对象的创造性方法