【问题标题】:Using java streams to create new map from existing map使用 java 流从现有地图创建新地图
【发布时间】:2017-08-01 06:19:41
【问题描述】:

我有一张结构如下的地图:

Map<String, Map<String, String>> input;

它基本上包含一组 ID,并且对于每个 ID,一个与属性关联的值。

For ex:
ID:       Attribute    Value
A           X           100
A           Y           200
B           X           40
B           Y           40

我只对每个 ID 的属性 X 感兴趣,我想做一些处理并将其存储为新地图 这将具有相同的定义 Map>

我正在 Java 8 中尝试这个:

Map<String, Map<String, String>> getResults(Map<String, Map<String, String>> input) {
    input.entrySet().stream()
        .map(id -> {
            String valueX = id.getValue().get("X");
            String computeX = compute(valueX);
            // Now start adding these results to the new map.
        } )
}

我无法跟随,如何将其添加到新地图。

【问题讨论】:

    标签: java java-8 hashmap


    【解决方案1】:

    您可以通过这种方式将输入映射的条目收集到一个新映射中:

    Map<String, Map<String, String>> getResults(Map<String, Map<String, String>> input) 
    {
        return input.entrySet()
                    .stream()
                    .collect(Collectors.toMap(Map.Entry::getKey,
                                              e -> {
                                                  Map<String,String> map = new HashMap<>(); 
                                                  map.put("X",e.getValue().get("X")); 
                                                  return map;
                                              }));
    }
    
    • 输出映射的键与输入映射的键相同。

    • 输出映射的值是通过创建一个新的HashMap&lt;String,String&gt; 并将"X" 键的值放入其中来构造的。

    【讨论】:

    • 我只需要返回 input.entrySet() 吗?
    • @user1692342 哦,答案已修复。
    • @user1692342 修复了另一个错字
    • 是否需要HashMape -&gt; Collections.singletonMap("X", e.getValue().get("X")) 会简单得多……
    • @Holger 这是真的。我总是倾向于默认选择HashMap,但在这种情况下singletonMap似乎更有意义(除非OP打算稍后修改这些地图)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    相关资源
    最近更新 更多