地图1:-
Map<String, List<Long>> prjReleaseMap = (Map<String, List<Long>>) configMap.get(PROJECTRELEASEMAP);
地图2:-
Map<Long, List<Long>> newprjReleaseMap = new HashMap<>();
我想在地图2中放置地图1的值。
答案 0 :(得分:1)
您可以循环浏览密钥集,然后隐藏密钥并将其放在新的Map
上。但是,您需要确保所有键Strings
实际上都在Long
上,否则会出现异常。
prjReleaseMap.keySet().forEach(e -> {
newprjReleaseMap.put(Long.parseLong(e), prjReleaseMap.get(e));
});
修改:
您可以先将List<Interger>
转换为List<Long>
,然后再将值放入新地图。请参考下面的代码。
prjReleaseMap.keySet().forEach(e -> {
newprjReleaseMap.put(Long.parseLong(e),
prjReleaseMap.get(e).stream().map(i -> i.longValue()).collect(Collectors.toList()));
});
如注释中所述,您可以直接在地图上进行迭代,而不必在键集上进行迭代。
prjReleaseMap.forEach((k, v) -> {
newprjReleaseMap.put(Long.parseLong(k), v.stream().map(i -> i.longValue()).collect(Collectors.toList()));
});
答案 1 :(得分:1)
如果您使用的是Java 8,则可以使用:
Map<Long, List<Long>> newprjReleaseMap = prjReleaseMap.entrySet().stream()
.collect(Collectors.toMap(k -> Long.parseLong(k.getKey()), Map.Entry::getValue));
我认为所有键都可以转换为Long。
如果您只想输入密钥有效的条目,则可以使用过滤器,如下所示:
Map<Long, List<Long>> newprjReleaseMap = prjReleaseMap.entrySet().stream()
.filter(k -> checkKey(k.getKey()))
.collect(Collectors.toMap(k -> Long.parseLong(k.getKey()), Map.Entry::getValue));
...
public static boolean checkKey(String value) {
try {
Long.parseLong(value);
return true;
} catch (NumberFormatException e) {
return false;
}
}
答案 2 :(得分:1)
如果您要做的只是构造一个新的Map<Long, List<Long>>
,其中prjReleaseMap
键将转换为long
值并保持原来的值,那么就可以完成如下:
prjReleaseMap.forEach((k, v) -> newprjReleaseMap.put(Long.parseLong(k), v));
但是,如果newprjReleaseMap
中可能已经有一些条目,并且您想将prjReleaseMap
的条目合并到newprjReleaseMap
中,则可以使用merge
方法:
prjReleaseMap.forEach((k, v) -> newprjReleaseMap.merge(Long.parseLong(k), v, (o, n) -> o));
这假定prjReleaseMap
的键是表示为long
的{{1}}值。上面的String
函数称为重映射函数,如果发生键冲突,则调用该函数来决定是保留旧值((o, n) -> o
)还是新值(o
)或调用另一个自定义函数来生成一个全新的值。