我有一个具有非独特键的 map 列表,并且喜欢使用 Streaming API 修改每个 map 值。结果应该是一个新列表,原来的列表必须保持不变。
示例数据:
// [ {jpg=firstImage.jpg, png=firstImage.png}, {jpg=secondImage.jpg, png=secondImage.png} ]
Map<String, String> map1 = new HashMap<>();
map1.put("jpg", "firstImage.jpg");
map1.put("png", "firstImage.png");
Map<String, String> map2 = new HashMap<>();
map2.put("jpg", "secondImage.jpg");
map2.put("png", "secondImage.png");
List<Map<String, String>> list = new ArrayList<>();
list.add(map1);
list.add(map2);
假设我想将文件名转换为大写。有了独特的值(value)观,我可以做到以下几点:
Map<String, String> copy = list.stream()
.flatMap(e -> e.entrySet().stream())
.collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().toUpperCase()));
但是 flatMap 在键不独特时不起作用,它会破坏我的 List<Map<String, String>>
结构。我知道结构不好,但我不能改变它。
预期结果:
// [ {jpg=FIRSTIMAGE.JPG, png=FIRSTIMAGE.PNG}, {jpg=SECONDIMAGE.JPG, png=SECONDIMAGE.PNG} ]
我想通过 Streaming API 实现这一点,并尽可能避免嵌套循环。
最佳答案
您不能使用 flatMap
,因为这样您会在单个流中连接所有条目,从而失去将它们取回的可能性。
您需要转换List
中的每个单独元素,例如:
List<Map<String, String>> result = list.stream()
.map(map -> map.entrySet().stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
e -> e.getValue().toUpperCase())))
.collect(Collectors.toList());
System.out.println(result);
// [{jpg=FIRSTIMAGE.JPG, png=FIRSTIMAGE.PNG}, {jpg=SECONDIMAGE.JPG, png=SECONDIMAGE.PNG}]
关于java - 使用 Streaming API 转换 map 列表中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43848861/