Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
列表中映射的Java流更改键_Java_Java Stream - Fatal编程技术网

列表中映射的Java流更改键

列表中映射的Java流更改键,java,java-stream,Java,Java Stream,是否可以使用java stream更改列表中地图的键,即,给出地图的原始列表是: List<Map<String, String>> list = new ArrayList<Map<String, String>>() {{ add(new HashMap<String, String>() {{ put("id", "1"); put("disp

是否可以使用java stream更改列表中地图的键,即,给出地图的原始列表是:

List<Map<String, String>> list = new ArrayList<Map<String, String>>() {{
            add(new HashMap<String, String>() {{
                put("id", "1");
                put("display", "foo");
            }});
            add(new HashMap<String, String>() {{
                put("id", "2");
                put("display", "bar");
            }});
        }};

        System.out.println(list.toString());
要查看地图列表,请执行以下操作:

[{sample=foo, sample_id=1}, {sample=bar, sample_id=2}]

基本上,将键“id”更改为“sample\u id”,将“display”更改为“sample”。

有一种方法可以遵循

您可以重写.toString()方法,并为其提供自己的实现。
通过这种方式,您可以以任何方式显示它。

最简单的方法是在
列表上进行流式处理,并将每个
HashMap
映射到翻译后的
HashMap

list.stream()
    .map(this::translate)
    .collect(Collectors.toList());
翻译后的
HashMap
是此
Map
的副本,每个键都已翻译:

 private Map<String, String> translate(Map<String, String> map) {
        HashMap<String, String> translatedMap = new HashMap<>(map);
        translate(translatedMap, "id", "sample_id");
        translate(translatedMap, "display", "sample");
        return translatedMap;
 }
这就行了,

    List<Map<String, String>> list2 = list.stream().map(e -> {
        Map<String, String> map = new HashMap<>();
        for (Map.Entry x : e.entrySet()) {
            if (x.getKey().equals("id")) {
                map.put("sample_id", (String) x.getValue());
            } else if (x.getKey().equals("display")) {
                map.put("sample", (String) x.getValue());
            } else {
                map.put((String) x.getKey(), (String) x.getValue());
            }
        }

        return map;
    }).collect(Collectors.toList());
List list2=List.stream().map(e->{
Map Map=newhashmap();
对于(Map.Entry x:e.entrySet()){
如果(x.getKey().equals(“id”)){
put(“sample_id”,(String)x.getValue();
}else如果(x.getKey().equals(“display”)){
put(“sample”,(String)x.getValue();
}否则{
map.put((String)x.getKey(),(String)x.getValue());
}
}
返回图;
}).collect(Collectors.toList());
稍微优雅一点

    List<Map<String, String>> list3 = list.stream().map(
            e -> e.entrySet().stream().collect(Collectors.toMap(
                    x -> {
                        if (x.getKey().equals("id")) {
                            return "sample_id";
                        } else if (x.getKey().equals("display")) {
                            return "sample";
                        } else {
                            return x.getKey();
                        }
                    },
                    Map.Entry::getValue))).collect(Collectors.toList());
List list3=List.stream().map(
e->e.entrySet().stream().collect(Collectors.toMap(
x->{
如果(x.getKey().equals(“id”)){
返回“样本id”;
}else如果(x.getKey().equals(“display”)){
返回“样本”;
}否则{
返回x.getKey();
}
},
collect(Collectors.toList());

如果您希望原始地图保持不变,请遵循Nick Vanderhoven的方法。但如果您可以更改输入映射,则可以缩短它,甚至不必流式传输:

list.forEach(map -> {
    map.put("sample", map.remove("display"));
    map.put("sample_id", map.remove("id"));
});
如果您愿意,当然可以使用streams(但仍然可以更改原始地图!):


我认为OP想要的不仅仅是改变地图条目的显示。他们希望更改实际的键。看起来您在编写自己的类时正在使用映射可能会更好。例如,如果列表中的所有地图都有两个键id和display,为什么不编写一个包含两个字段id和display的类?此外,请不要使用{…}初始化列表和映射,尽管这违反了使用此类
列表
映射
组合的良好实践。不过,看看是否可以使用流重命名密钥(remove和put)会很有趣。不过,我怀疑CME的可能性很高。任何避免使用{{…}的列表/地图的原因都可以找到避免使用{{}的答案。
    List<Map<String, String>> list2 = list.stream().map(e -> {
        Map<String, String> map = new HashMap<>();
        for (Map.Entry x : e.entrySet()) {
            if (x.getKey().equals("id")) {
                map.put("sample_id", (String) x.getValue());
            } else if (x.getKey().equals("display")) {
                map.put("sample", (String) x.getValue());
            } else {
                map.put((String) x.getKey(), (String) x.getValue());
            }
        }

        return map;
    }).collect(Collectors.toList());
    List<Map<String, String>> list3 = list.stream().map(
            e -> e.entrySet().stream().collect(Collectors.toMap(
                    x -> {
                        if (x.getKey().equals("id")) {
                            return "sample_id";
                        } else if (x.getKey().equals("display")) {
                            return "sample";
                        } else {
                            return x.getKey();
                        }
                    },
                    Map.Entry::getValue))).collect(Collectors.toList());
list.forEach(map -> {
    map.put("sample", map.remove("display"));
    map.put("sample_id", map.remove("id"));
});
list.stream()
    .peek(map -> {
        map.put("sample", map.remove("display"));
        map.put("sample_id", map.remove("id"));
    })
    .collect(Collectors.toList());