使用流将字符串列表转换为具有自定义键的映射列表

时间:2017-10-31 03:54:44

标签: java lambda java-stream

给出这样的字符串列表:

"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"
}
]

3 个答案:

答案 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());