首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java 8流:迭代列表映射

Java 8流:迭代列表映射
EN

Stack Overflow用户
提问于 2014-12-12 16:47:56
回答 3查看 57K关注 0票数 11

我有以下对象和地图:

代码语言:javascript
运行
复制
MyObject
    String name;
    Long priority;
    foo bar;

Map<String, List<MyObject>> anotherHashMap;

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

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

代码语言:javascript
运行
复制
Map<String, List<String>> result = new HashMap<>();
for (String identifier : anotherHashMap.keySet()) {
    List<String> generatedList = anotherHashMap.get(identifier).stream()...;

    teaserPerPage.put(identifier, generatedList);
}

有什么主意吗?我试过了,但被卡住了:

代码语言:javascript
运行
复制
anotherHashMap.entrySet().stream().collect(Collectors.asMap(..., ...));
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-12 19:18:55

代码语言:javascript
运行
复制
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
        );

本质上,您在每个条目集上进行流并将其收集到一个新的地图中。要计算新映射中的值,您可以从旧映射流到List<MyOjbect>,对其进行排序,并应用映射和集合函数。在本例中,我使用MyObject::getName作为映射,并将生成的名称收集到列表中。

票数 12
EN

Stack Overflow用户

发布于 2014-12-12 16:53:24

为了生成另一张地图,我们可以有如下内容:

代码语言:javascript
运行
复制
HashMap<String, List<String>> result = anotherHashMap.entrySet().stream().collect(Collectors.toMap(elem -> elem.getKey(), elem -> elem.getValue() // can further process it);

上面我正在重新创建地图,但您可以根据您的需要处理键或值。

票数 2
EN

Stack Overflow用户

发布于 2014-12-13 02:27:58

代码语言:javascript
运行
复制
Map<String, List<String>> result = anotherHashMap.entrySet().stream().collect(Collectors.toMap(
    Map.Entry::getKey,
    e -> e.getValue().stream()
        .sorted(comparing(MyObject::getPriority))
        .map(MyObject::getName)
        .collect(Collectors.toList())));

类似于Mike的答案,但排序被应用于正确的位置(即值被排序,而不是映射项),并且使用更简洁的静态方法Comparator.comparing来获得排序的比较器。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27448266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档