我正在尝试将一个地图转换为另一个地图,其中新键只是原始键toString((。使用流 API,我按如下方式执行此操作:
mapMap.entrySet().stream().collect(Collectors.toMap(
(Map.Entry entry) -> entry.getKey().toString(),
(Map.Entry entry) -> entry.getValue()
));
问题是这不会保留内部 Map 类型。如果原始地图恰好是 HashMap,我不介意返回树状图,但反过来是一个问题,因为元素的排序被删除了。我一直在玩弄上述代码的变体来完成这项工作,但我似乎并没有走得太远。现在,我已经在没有流的情况下编写了它,如下所示:
TreeMap<String, Integer> stringMap = new TreeMap<>();
for (OriginalType t: originalMap.keySet()) {
stringMap.put(t.toString(), originalMap.get(t));
}
谁能让我朝着正确的方向来用流做到这一点?谢谢
存在
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<>()
));
(关于第三个参数的说明:它旨在作为一个函数,它将具有相同键的两个值合并在一起。 当我不希望这些事情发生时,我宁愿抛出一个例外。