java.util.concurrent.ConcurrentMap
,来自Java8
has
putIfAbsent(K key, V value)
返回现有值,以及如果为null插入给定值。因此,如果不存在密钥返回的值
null并插入给定值,则否则返回具有值
如果您需要对价值的懒惰评估,则
computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction)
java 8在map
中添加了不错的方法:compute
,computeifpresent,
要实现您需要的东西:
Object existingOrCreated = map.computeIfAbsent(key, (k) -> new Object());
这种模式的问题是,您必须以某种方式定义在返回null的情况下应使用的值。
肯定有图书馆,而IIRC也有一些新的收藏可以做到这一点,但不幸的是,我不记得那是哪些。
get()
注意,您要么必须在方法中抛出反射异常,要么在方法中处理它们。此外,这需要java 8Update其他答案中已经提到了它,但是为了完整的目的,我也会在此处添加信息。 Java 8的默认方法
valueClass
computeIfAbsent(key, mappingFunction)
BigDecimal
该方法的实现类似于上面定义但更灵活的,在地图实例中直接可用,并进行了更好的测试。因此,如果可能的话,我建议您改用
BigDecimal value = map.computeIfAbsent(key, k -> new BigDecimal("123.456"));
。
您可以从eclipsecollections
返回映射到密钥的值或插入给定值并返回给定值(如果未映射到键)返回给定值。您可以使用方法参考来创建一个新的
safeGet(...)
:
computeIfAbsent()
或您可以直接创建一个新的
getIfAbsentPut()
:
Object
在第一个示例中,只有在没有映射到键的值时才会创建对象。
在第二个示例中,无论如何将创建对象。 注:我是Eclipse收藏的贡献者。
在任何情况下,如果不存在,则需要在地图中获取默认数据
MutableMap<String, Object> map = Maps.mutable.empty();
Object value = map.getIfAbsentPut("key", Object::new);
eDIT:请注意,下面提到的功能已持续不推荐,应该使用
cachebuilder。
guava
库有一个“计算映射”,请参见mapmaker.makecomputingmap(function)
.。
Object
如果您需要多次功能,请将其提取到实用程序类中,然后创建这样的地图(其中
MutableMap<String, Object> map = Maps.mutable.empty();
Object value = map.getIfAbsentPut("key", new Object());
是静态函数实例):