我有以下列表[12_223,13_4356,15_5676]
我能够拆分下划线并使用下面的代码将其转换为一个Hashmap
list.stream()
.map(s -> s.split("_"))
.collect(Collectors.toMap(
a -> a[0],
a -> a[1]));
它给出了下面的地图{"12"="223", "13"="4356", "15"="5676"}
但我想更改此代码,以便它给我一个像下面的地图列表,因为我可能会在分割时遇到重复的键
[{"12"="223"}, {"13"="4356"}, {"15"="5676"}]
如果你真的希望结果是一个地图列表,我会这样做:
List<Map<String, String>> listOfMaps(List<String> list) {
return list.stream()
.map(s -> s.split("_", 2))
.map(a -> Collections.singletonMap(a[0], a[1]))
.collect(toList());
}
(HT:Eugene推荐split("_", 2)
。)
在Java 9中,您可以这样做:
List<Map<String, String>> listOfMaps(List<String> list) {
return list.stream()
.map(s -> s.split("_", 2))
.map(a -> Map.of(a[0], a[1]))
.collect(toList());
}
在这两种情况下,结果列表中的映射实例都是不可修改的。
这可以满足您的需求
List<Map<String, String>> output = list.stream().map(
s-> {
Map<String, String> element = new HashMap<>();
String[] arr = s.split("_");
element.put(arr[0], arr[1]);
return element;
}).collect(Collectors.toList());
但正如@Pshemo所说,这应该更合适
Map<String, List<String>> outputnew = list.stream().map(
s -> s.split("_"))
.collect(Collectors.groupingBy(s -> s[0],
Collectors.mapping(s -> s[1], Collectors.toList())));