Java源码解析|HashMap的前世今生 (5)

computelfPresent方法:表示只有在key存在的时候,才执行计算

public void compute(){ HashMap<Integer,Integer> map = Maps.newHashMap(); map.put(10,10); log.info("compute 之前值为:{}",map.get(10)); map.compute(10,(key,value) -> key * value); log.info("compute 之后值为:{}",map.get(10)); // 还原测试值 map.put(10,10); // 如果为 11 的 key 不存在的话,需要注意 value 为空的情况,下面这行代码就会报空指针 // map.compute(11,(key,value) -> key * value); // 为了防止 key 不存在时导致的未知异常,我们一般有两种办法 // 1:自己判断空指针 map.compute(11,(key,value) -> null == value ? null : key * value); // 2:computeIfPresent 方法里面判断 map.computeIfPresent(11,(key,value) -> key * value); log.info("computeIfPresent 之后值为:{}",map.get(11)); } 结果是: compute 之前值为:10 compute 之后值为:100 computeIfPresent 之后值为:null(这个结果中,可以看出,使用 computeIfPresent 避免了空指针) 从前世到今生的奈何桥——default

Java8在集合类上新增了很多方法,为什么Java7中这些接口的的实现者不需要强制实现这些方法呢?
主要是因为这些新增的方法被default 关键字修饰了,default一旦修饰接口上的方法,我们需要在接口的方法中写默认实现,并且子类无需强制实现这些方法,所以Java7接口的实现者无需感知。

总结:HashMap的三生三世

Java8在Java7的基础上,做了一些改进和优化,通过default关键字来连接两代。HashMap几乎重写了一套,所有的集合都新增了函数式的方法,比如说forEach,也新增了很多好用的函数。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wspxsp.html