win api画菱形_地图合并和计算,隐藏的API菱形

本文探讨了Java 1.8中Map类提供的merge()和compute()方法,这两种方法用于在Map中更新或插入值,同时避免了显式的null检查。通过示例代码展示了这些方法如何简化常见的Map操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

win api画菱形

如果您是从“相当一段时间”开始就使用Java的,那么您可能对使用Map对象很有经验。 一种非常常见的用例是检查Map包含值:

  1. 获得价值
    • 如果该值为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)方法,该方法接受以下参数:

  1. 关键
  2. 默认值。 如果没有对应于键的值, 或者该值为null ,则该方法会将默认值与键相关联
  3. 重映射BiFunction
    1. 第一个参数是键映射的当前值
    2. 第二个参数是默认值
    3. 返回值是新的计算值

可以使用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)是另一个可用的替代方法。 它接受以下参数:

  1. 关键
  2. 重映射BiFunction
    1. 第一个参数是关键
    2. 第二个参数是当前值
    3. 返回值是新的计算值

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画菱形

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值