java - 使用 Streaming API 转换 map 列表中的值

标签 java java-stream

我有一个具有非独特键的 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/

相关文章:

Java 8 流 : Collapse/abstract streams parts

java - 如何有条件地修改 Java 8 流 API 中的 map ?

java - 从代码点数字的 IntStream 中创建一个字符串?

java - 将 array_walk 从 php 转换为 java 方法

java - 命名约定 'of' 在 Java 中是什么意思?

java - 在正确的区域设置中使用 toUpperCase

java - 使用命令 java 设置颜色和半径

Java - 将计时器代码放在我的文件中的哪里?

java - Spring 框架中错误的请求绑定(bind)对象

Java 8 流组合器从未调用过