基于Java中的其他映射更新Map中的值

dev*_*v ツ 5 java dictionary

Map<String, String> map1 = new HashMap<>();
map1.put("k1", "v1");
map1.put("k2", "v2");
map1.put("k3", "v3");

Map<String, String> map2 = new HashMap<>();
map2.put("v1", "val1");
map2.put("v2", "val2");
map2.put("v3", "vav3");
Run Code Online (Sandbox Code Playgroud)

我想更新map1的值,以便它有条目:

  • "k1","val1",
  • "k2","val2",
  • "k3","val3"

我的解决方案

for (Map.Entry<String, String> entry : map1.entrySet()) {
   map1.put(entry.getKey(), map2.get(entry.getValue()));
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来做到这一点?

编辑:我正在使用Java 7,但很想知道Java 8中是否有更好的方法.

Tun*_*aki 3

从 Java 8 开始,您可以

map1.replaceAll((k, v) -> map2.get(v));
Run Code Online (Sandbox Code Playgroud)

replaceAll(function)map1将用应用给定函数的结果替换映射中的所有值。在这种情况下,该函数只是从 中检索值map2

请注意,此解决方案与您的初始代码具有相同的问题:如果map2没有相应的映射,null则将返回。在这种情况下,您可能需要调用getOrDefault以获取默认值。

public static void main(String[] args) {
    Map<String, String> map1 = new HashMap<>();
    map1.put("k1", "v1");
    map1.put("k2", "v2");
    map1.put("k3", "v3");

    Map<String, String> map2 = new HashMap<>();
    map2.put("v1", "val1");
    map2.put("v2", "val2");
    map2.put("v3", "val3");

    map1.replaceAll((k, v) -> map2.get(v));

    System.out.println(map1); // prints "{k1=val1, k2=val2, k3=val3}"
}
Run Code Online (Sandbox Code Playgroud)