列表中映射的Java流更改键
是否可以使用java stream更改列表中地图的键,即,给出地图的原始列表是:列表中映射的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
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());