使用流/收集来转换地图

时间:2017-06-17 13:14:59

标签: java-8 java-stream

我正在尝试将Map转换为另一个Map,其中新键只是原始键toString()。使用流API,我按如下方式执行此操作:

    mapMap.entrySet().stream().collect(Collectors.toMap(
            (Map.Entry entry) -> entry.getKey().toString(),
            (Map.Entry entry) -> entry.getValue()
    ));

问题是这不会保留内部Map类型。如果原始地图恰好是HashMap,我不介意返回TreeMap,但另一种方法是有问题的,因为删除了元素的排序。我一直在使用上述代码的变体来搞定这个,但我似乎并没有走得太远。现在,我写的没有溪流,如下:

    TreeMap<String, Integer> stringMap = new TreeMap<>();
    for (OriginalType t: originalMap.keySet()) {
        stringMap.put(t.toString(), originalMap.get(t));
    }

任何人都可以通过溪流让我朝着正确的方向前进吗? 感谢

1 个答案:

答案 0 :(得分:5)

Collectors.toMap超载,您可以指定要返回的地图类型。

mapMap.entrySet().stream().collect(Collectors.toMap(
        (Map.Entry entry) -> entry.getKey().toString(),
        (Map.Entry entry) -> entry.getValue(),
        (val1, val2) -> { throw new RuntimeException("Not expecting duplicate keys"); },
        () -> new TreeMap<>()
));

(关于第三个参数的注释:它的目的是将两个具有相同键的值合并在一起。当我不希望这些事情发生时,我宁愿抛出异常。)