win api画菱形
如果您是从“相当一段时间”开始就使用Java的,那么您可能对使用Map
对象很有经验。 一种非常常见的用例是检查Map
包含值:
- 获得价值
- 如果该值为
null
,则输入一个初始值。 - 如果不是,则转换获取值并将新值放在同一键下的地图中
- 如果该值为
Map<String,Integer>map=newHashMap<>();
// ...
Integervalue=map.get(key);
if(value==null){
map.put(key,1);
}else{
map.put(key,++value);
}
Java为此提供了两种抽象,它们的语义略有不同。
合并
从Java 1.8开始, Map
提供了merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction)
方法,该方法接受以下参数:
- 关键
- 默认值。 如果没有对应于键的值, 或者该值为
null
,则该方法会将默认值与键相关联 - 重映射
BiFunction
:- 第一个参数是键映射的当前值
- 第二个参数是默认值
- 返回值是新的计算值
可以使用merge()
重写上面的代码,如下所示:
map.merge(key,1,(oldValue,defaultValue)->oldValue+1);
此外 ,如果BiFunction
返回的BiFunction
null
,则该方法将删除映射。
计算
自Java 1.8起compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)
是另一个可用的替代方法。 它接受以下参数:
- 关键
- 重映射
BiFunction
:- 第一个参数是关键
- 第二个参数是当前值
- 返回值是新的计算值
与merge()
一样,如果BiFunction
返回的BiFunction
null
,则将删除该映射。
可以使用compute()
重写以上代码,如下所示:
map.compute(key,(aKey,value)->{
if(value==null){
return1;
}else{
return++value;
}
});
compute()
和merge()
之间的差异是细微但重要的。 对于前者,在任何情况下都将调用BiFunction
,而对于后者,仅当值不为null
时才调用。 另外,请注意, BiFunction
参数根据方法引用了不同的参数。
当且仅当保证该值不为null
,以上代码才能重写为:
map.compute(key,(aKey,value)->++value);
为确保此假设成立,还提供了专用方法, computeIfPresent()
和相同的参数:
map.computeIfPresent(key,(aKey,value)->++value);
对应项可用, computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)
。 请注意, BiFunction
替换为简单的Function
,因为无需传递值,因为它保证为null
。
结论
每个Java版本都添加了新的抽象,可以改进代码的编写方式。 在Java 8中的现有类上引入了许多利用新功能接口的方法。 请务必阅读它们,并了解它们如何使您的代码更具可读性:更多关于什么,而更少关于如何。
翻译自: https://blog.frankel.ch/map-merge-compute/
win api画菱形