[英]Convert a list of strings to a list of maps using Java streams
我有以下模式的字符串列表
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);
}
}
通過不與鍵(名稱和年齡)匹配,而是在創建地圖元素時對它們進行硬編碼,可以稍微改善性能。
如果您想提高性能,請放棄Stream API。 尤其是帶有子流的流確實不利於編寫高性能的應用程序。
這是您的Stream API版本與普通的for循環的比較:
public static void main(String[] args) {
final String test = "name=john,age=28;name=paul,age=30;name=adam,age=50";
final List<Map<String, String>> result1 = loop(test);
final List<Map<String, String>> result2 = stream(test);
System.out.println(result1);
System.out.println(result2);
}
private static List<Map<String, String>> loop(String str) {
long start = System.nanoTime();
List<Map<String, String>> result = new ArrayList<>();
String[] persons = str.split(";");
for (String person : persons) {
String[] attributes = person.split(",");
Map<String, String> attributeMapping = new HashMap<>();
for (String attribute : attributes) {
String[] attributeParts = attribute.split("=");
attributeMapping.put(attributeParts[0], attributeParts[1]);
}
result.add(attributeMapping);
}
long end = System.nanoTime();
System.out.printf("%d nano seconds\n", (end - start));
return result;
}
private static List<Map<String, String>> stream(final String str) {
long start = System.nanoTime();
List<String> listOfStrings = Arrays.asList(str.split(";"));
List<Map<String, String>> result = 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());
long end = System.nanoTime();
System.out.printf("%d nano seconds\n", (end - start));
return result;
}
Outpout:
183887納秒
53722108納秒
[{name = john,age = 28},{name = paul,age = 30},{name = adam,age = 50}]
[{name = john,age = 28},{name = paul,age = 30},{name = adam,age = 50}]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.