javamap.get(key) - 是否有一种方法可以自动调用put(键)并在键不存在时返回? 我对以下模式感到厌倦: 值= map.get(key); if(value == null){ value = new Object(); map.put(键,值); } 此示例仅刮擦额外代码的表面是

问题描述 投票:0回答:5
此示例仅在嵌套地图以表示多维结构时刮擦要编写的额外代码的表面。 我确定某处存在某些东西可以避免这种情况,但是我的谷歌搜索努力并没有任何相关。有什么建议吗?


java.util.concurrent.ConcurrentMap

,来自Java8

java dictionary get null
5个回答
80
投票

has

putIfAbsent(K key, V value) 

返回现有值,以及如果为null插入给定值。因此,如果不存在密钥返回的值

null
并插入给定值,则否则返回
具有值

如果您需要对价值的懒惰评估,则
computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction)

java 8在map

中添加了不错的方法:

compute

computeifpresent

77
投票

要实现您需要的东西: Object existingOrCreated = map.computeIfAbsent(key, (k) -> new Object()); 这种模式的问题是,您必须以某种方式定义在返回null的情况下应使用的值。 肯定有图书馆,而IIRC也有一些新的收藏可以做到这一点,但不幸的是,我不记得那是哪些。

,但是,只要您有一种创建新值的标准方法,就可以自己编写实用程序方法。这样的事情可能会起作用:

get()
注意,您要么必须在方法中抛出反射异常,要么在方法中处理它们。此外,这需要

10
投票
提供一个无折磨的构造函数。另外,您可以简单地传递应使用的默认值。

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收藏的贡献者。

4
投票

在任何情况下,如果不存在,则需要在地图中获取默认数据 MutableMap<String, Object> map = Maps.mutable.empty(); Object value = map.getIfAbsentPut("key", Object::new);

javadocs
    

eDIT:

请注意,下面提到的功能已持续不推荐,应该使用
cachebuilder

guava

库有一个“
计算映射”,请参见

mapmaker.makecomputingmap(function)
.

Object

如果您需要多次功能,请将其提取到实用程序类中,然后创建这样的地图(其中

MutableMap<String, Object> map = Maps.mutable.empty(); Object value = map.getIfAbsentPut("key", new Object());

是静态函数实例):


2
投票

也许我没有看到整个问题,但是如何使用继承或组成将此行为添加到地图对象?
    

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.