java - map 的通用 autovivify 函数

标签 java generics dictionary autovivification

如何使用泛型创建一个活跃的 key ?此代码甚至无法编译:

/* populate the map with a new value if the key is not in the map */
private <K,V> boolean autoVivify(Map<K,V> map, K key)
{
  if (! map.containsKey(key))
  {
    map.put(key, new V());
    return false;
  }
  return true;
}

最佳答案

在 Java-8 中提供 Supplier 并使用 computeIfAbsent 是合理的:

private <K,V> boolean autoVivify(Map<K,V> map, K key, Supplier<V> supplier) {
    boolean[] result = {true};
    map.computeIfAbsent(key, k -> {
      result[0] = false;
      return supplier.get();
    });
    return result[0];
}

使用示例:

Map<String, List<String>> map = new HashMap<>();
autoVivify(map, "str", ArrayList::new);

请注意,与 containsKey/put 不同,使用 computeIfAbsent 的解决方案对于并发映射是安全的:不会发生竞争条件。

关于java - map 的通用 autovivify 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32223392/

相关文章:

java - 将元素列表的列表转换为 Map < K, List<V>>

java - 将对象数组转换为泛型类型

java - 如何在运行时设置通用Java类的类型?

java - 在java中获取hashmap中的最高值

java - 在linux上配置多个java

java - 防止 4 路路口的汽车在 Java 中崩溃

java - 为什么 do-while 循环在这个 Java 程序中没有按预期运行?

java - 如何准备 List<Entry< 类型的参数?扩展类 <?>, ?>>

scala - 与 scala 中的符号混淆

json - 创建用于 key 签名的有序 json 字符串