今天栈长分享了一个实用的Java8开发技巧,就是在Map接口中添加的compute方法,用于Map集合的计算和更新。compute的介绍如下。Java8为Map和ConcurrentMap接口都增加了三个计算方法,表明它也支持多线程并发安全操作。这三种方法的区别:compute:计算并更新值computeIfAbsent:如果Value不存在则计算computeIfPresent:如果Value存在则计算?计算有什么用?我们来看一个不使用Java8的小例子:/***公众号:Java技术栈*/privatestaticvoidpreJava8(){Listanimals=Arrays.asList("dog","cat","cat","dog","fish","dog");Mapmap=newHashMap<>();for(Stringanimal:animals){Integercount=map.get(animal);map.put(animal,count==null?1:++count);}System.out.println(map);}Output:{cat=2,fish=1,dog=3}这是每个动物的个数一个列表中的动物,无论代码多么精简,都需要一个get操作来判断集合中是否有元素,然后判断是否初始化:1,还是+1。在很多情况下,这个get操作显然是不必要的,所以Java8提供了三种compute方法,让我们看看如何使用吧!Java8计算实现:/***公众号:Java技术栈*/privatestaticvoidinJava8(){Listanimals=Arrays.asList("dog","cat","cat","dog","fish","dog");Mapmap=newHashMap<>();for(Stringanimal:animals){map.compute(animal,(k,v)->v==null?1:++v);}System.out.println(map);}使用compute方法一行搞定,省去使用取值再判断的冗余操作,可以直接获取元素值和计算更新,是不是很方便?羊毛布?计算源码分析这还是默认的方法。为什么它是默认方法也是为了不改变它的所有实现类。关于默认方法的定义,可以关注公众号Java技术栈获取Java8+系列教程。/***公众号:Java技术栈*/defaultVcompute(Kkey,BiFunctionremappingFunction){//函数接口不能为空Objects.requireNonNull(remappingFunction);//获取旧的ValueVoldValue=get(key);//获取计算出的新值VnewValue=remappingFunction.apply(key,oldValue);if(newValue==null){//新值为空//deletmappingif(oldValue!=null||containsKey(key)){//当旧值存在时//移除键值remove(key);returnnull;}else{//nothingtodo.Leavethingsastheywere.returnnull;}}else{//新值不为空//添加或覆盖旧值put(key,newValue);returnnewValue;}}实现逻辑其实很简单。事实上,函数式编程结合Java8让代码更简单,Java也越来越聪明。我不会演示其他两种方法。它们在特定场合一定非常有用。每个人都知道并在需要时使用它们是有好处的。本教程所有实战源码已经上传到本仓库:https://github.com/javastacks/javastack本次分享到此结束,希望对大家有用。我觉得不错,正在看,转发分享~