Java 8 流 : iterate over Map of Lists

标签 java hashmap java-8 java-stream

我有以下对象和 map :

MyObject
    String name;
    Long priority;
    foo bar;

Map<String, List<MyObject>> anotherHashMap;

我想在另一个 map 中转换 map 。结果映射的键是输入映射的键。结果映射的值是我的对象的属性“名称”,按优先级排序。

排序 和提取名称不是问题,但我无法将其放入结果映射中。我用旧的 Java 7 方式来做,但如果可以使用流式 API 就好了。

Map<String, List<String>> result = new HashMap<>();
for (String identifier : anotherHashMap.keySet()) {
    List<String> generatedList = anotherHashMap.get(identifier).stream()...;

    teaserPerPage.put(identifier, generatedList);
}

有人有想法吗?我试过了,但卡住了:

anotherHashMap.entrySet().stream().collect(Collectors.asMap(..., ...));

最佳答案

Map<String, List<String>> result = anotherHashMap
    .entrySet().stream()                    // Stream over entry set
    .collect(Collectors.toMap(              // Collect final result map
        Map.Entry::getKey,                  // Key mapping is the same
        e -> e.getValue().stream()          // Stream over list
            .sorted(Comparator.comparingLong(MyObject::getPriority)) // Sort by priority
            .map(MyObject::getName)         // Apply mapping to MyObject
            .collect(Collectors.toList()))  // Collect mapping into list
        );

本质上,您流过每个条目集并将其收集到新 map 中。要计算新 map 中的值,您可以流过 List<MyOjbect>从旧 map 中排序,并对其应用映射和收集功能。在这种情况下,我使用了 MyObject::getName作为映射并将结果名称收集到列表中。

关于Java 8 流 : iterate over Map of Lists,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27448266/

相关文章:

java - 如何使用Textureview作为cameraX的预览 [Java]

java - 如何用用户输入的字符串结束 do while 循环?

Java、Hashmap、数据类型转换

java - Linkedhashmap<字符串,对象>

java - 有没有办法检查 Stream 是否包含所有集合元素?

java - 使用 Java Streams 将对象列表转换为带过滤器的字符串列表

java - Eclipse 文本高亮显示

Java Swing JComboBox,mouseListener 不工作

c++ - 使用按插入方式排序的参数创建 HashMap

java - @FunctionalInterfaces 可以有默认方法吗?