给出这样的字符串列表:
"Y:Yes",
"N:No",
"A:Apple"
我有类似
的东西Map updated = values.stream().map(v -> v.split(":")).collect(Collectors.toMap(v1 -> v1[0],v1->v1.length>1?v1[1]:v1[0]));
但是这给了我地图:
{
"Y":"Yes",
"N":"No",
"A":"Apple"
}
如何获得地图列表:
[
{
name:"Y",
display:"Yes"
},
{
name:"N",
display:"No"
},
{
name:"A",
display:"Apple"
}
]
答案 0 :(得分:2)
如果您使用的是Java 9,则可以使用新的immutable map static factory methods,如下所示:
List<Map<String, String>> updated = values.stream()
.map(v -> v.split(":"))
.map(a -> Map.of("name", a[0], "display", a[1]))
.collect(Collectors.toList());
答案 1 :(得分:1)
由于您希望获得列表而非地图,因此您的上一个函数调用不能是Collectors.toMap
,需要为Collectors.toList
。现在,对map
方法的每次调用都应该生成一个新的Map,所以这样的事情会这样:
List updated = values.stream()
.map(v -> {
String[] parts = v.split(":");
Map<String, String> map = new HashMap<>();
map.put("name", parts[0]);
map.put("display", parts[1]);
return map;
)
.collect(Collectors.toList());
有些人会更喜欢:
List updated = values.stream()
.map(v -> {
String[] parts = v.split(":");
return new HashMap<>() {{
put("name", parts[0]);
put("display", parts[1]);
}};
)
.collect(Collectors.toList());
创建一个额外的帮助类。或者,如果你可以使用番石榴:
List updated = values.stream()
.map(v -> {
String[] parts = v.split(":");
return ImmutableMap.of("name", parts[0], "display", parts[1]);
)
.collect(Collectors.toList());
BTW:在我使用List
的示例中,您所描述的完整类型为List<Map<String, String>>
。
答案 2 :(得分:1)
如果您仍在使用 Java8 ,则可以使用以下内容,如果您碰巧使用 Java9 ,那么请查看Federicos answer:
final List<Map<String,String>> updated = values.stream()
.map(v -> v.split(":"))
.map(arr -> {
Map<String, String> map = new HashMap<>();
map.put("name", arr[0]);
map.put("display", arr[1]);
return map;
})
.collect(Collectors.toList());