将值放入java8映射时是否有类似getOrDefault的内容?

将值放入java8映射时是否有类似getOrDefault的内容?,java,java-8,hashmap,Java,Java 8,Hashmap,在java8中,当从映射中获取一些值时,我们可以编写: int keyCount=countMap.getOrDefault(key,0); 这等于: if(countMap.contains(key)){ keyCount=countMap.get(key); }else{ keyCount=0; } 问题是,是否有任何优雅的方法来替换以下代码: if(countMap.keySet().contains(key)){ countMap.put(key,countM

在java8中,当从映射中获取一些值时,我们可以编写:

int keyCount=countMap.getOrDefault(key,0);
这等于:

if(countMap.contains(key)){
    keyCount=countMap.get(key);
}else{
    keyCount=0;
}
问题是,是否有任何优雅的方法来替换以下代码:

if(countMap.keySet().contains(key)){
    countMap.put(key,countMap.get(key)+1);
}else{
    countMap.put(key,1);
}
您正在寻找同样在Java8中添加的方法。该方法接收您正在使用的键,以及基于键和现有值计算新值的
双功能。因此,在您的情况下,它将类似于以下内容:

countMap.compute(key, (k, oldValue) -> oldValue == null ? 1 : oldValue + 1);
当您提供的键在地图中尚不存在时,
BiFunction
中的旧值将为
null
;如果在
BiFunction
中返回
null
,则不会将任何内容放入映射中

这需要一点时间来适应,但一旦你掌握了窍门,这是一个非常强大的方法。使用方法引用而不是内联lambda,它可能更可读(尽管更详细):

countMap.compute(key,this::incrementOrSetToOne);
// ... 其他一些代码。。。
私有整数递增设置通(键类型键,整数旧值){
返回oldValue==null?1:oldValue+1;
}

正如霍尔格所提到的,您可以简单地使用As:

请注意,文档中也说明了它的实现:

默认实现相当于对此映射执行以下步骤,然后返回当前值,如果没有,则返回null:

V oldValue = map.get(key);
V newValue = (oldValue == null) ? value :
             remappingFunction.apply(oldValue, value);
if (newValue == null)
    map.remove(key);
else
    map.put(key, newValue);

对于那些不熟悉合并方法的人:

countMap.put(key, countMap.getOrDefault(key,0)+1);

查看“computeIfAbsent”,地图界面的一部分和另一个变体
countMap.put(key,countMap.containsKey(key)?countMap.get(key)+1:1)
使用countMap.merge(key,1,Integer::sum)更简单。
@Holger是的。我总是忘记合并。谢谢你的提醒。
countMap.put(key, countMap.getOrDefault(key,0)+1);