使用Java8的进来,这几个方法不香吗?
Map新增的方法简化代码开发。Map几个新方法:
预防空指针问题
Map获取元素,然后进行相关的业务处理,示例代码如下:Map<String, String> map = new HashMap();
map.put("公号", "小黑十一点半");
map.put("主理人", "楼下小黑哥");
// 可能存在 NPE 问题
System.out.println(map.get("支付").toUpperCase());
Map中相应元素不存在,那么我们就会碰到空指针问题。null,如果不为 null,再做相应的业务处理。// 第一种 if 判空
String value = map.get("支付");
if (!Objects.isNull(value)) {
System.out.println(value.toUpperCase());
}
// 第一种 if 判空
String value = map.get("支付");
// 第二种 条件运算符
value = Objects.isNull(value) ? "" : value;
ps: 这里的前提,空字符串对于业务没有特殊意义。如果存在特殊意义,那就不能使用这种方式了。
Map#getOrDefault直接代替条件运算符。// 等同于条件运算符的效果:Objects.isNull(value) ? "" : value;
String value = map.getOrDefault("支付","");
Map#getOrDefault 一行代码直接搞定,就是这么简单。MapUtils 避免空指针。// Apache MapUtils
String value = MapUtils.getString(map, "支付", "");
MapUtils这个工具类相对于Map#getOrDefault有一个好处,针对传入 Map为 null 的情况,可以设置默认值。POJO对象获取 Map 参数,这个时候为了防止空指针,我们就需要提前做一个空指针的判断。MapUtils,那我们就不需要判断是否为 null,方法内部已经封装这个逻辑。MapUtils.getString(pojo.getMap(),"支付", "");
巧用 computeIfAbsent
Map<K, List<V>>这个结构。Map<String, List<String>> map = new HashMap();
List<String> classify = map.get("java框架");
if (Objects.isNull(classify)) {
classify = new ArrayList<>();
classify.add("Spring");
map.put("java框架", classify);
} else {
classify.add("Spring");
}
Map新增一个 computeIfAbsent方法:default V computeIfAbsent(K key,
Function<? super K, ? extends V> mappingFunction) {
Map中 key 对应的 value 不存在,则会将 mappingFunction 计算产生的值作为保存为该 key 的 value,并且返回该值。否则不作任何计算,将会直接返回 key 对应的 value。Map#computeIfAbsent一行代码完成上面的场景,示例代码如下:map.computeIfAbsent("java框架", key -> new ArrayList<>()).add("Spring");
Map 中还有一个方法 putIfAbsent,功能跟 computeIfAbsent比较类似。putIfAbsent完成上面的需求:// ERROR:会有 NPE 问题
map.putIfAbsent("java框架", new ArrayList<>()).add("Spring");
Map 中 key 对应 value 不存在的时候,putIfAbsent将会直接返回 null。computeIfAbsent将会返回 mappingFunction计算之后的值,像上面的场景直接返回就是 new ArrayList。Multiset,以此快速完成一个键需要映射到多个值的场景。ArrayListMultimap<Object, Object> multiset= ArrayListMultimap.create();
multiset.put("java框架","Spring");
multiset.put("java框架","Mybatis");
// java框架--->Spring,Mybatis
单词统计
Map存储相关单词的次数即可,示例代码如下:Map<String, Integer> countMap = new HashMap();
Integer count = countMap.get("java");
if (Objects.isNull(count)) {
countMap.put("java", 1);
} else {
countMap.put("java", count++);
}
Map 新增方法进行改造,这次使用上面用过的 getOrDefault 再加 put 方法快速解决,示例代码如下:// getOrDefault
Integer count = countMap.getOrDefault("java",0);
countMap.put("java", count + 1);
Map#merge这个新方法,一句代码完成上述需求,示例代码如下:countMap.merge("java", 1, Integer::sum);
merge这个方法的时候还是有点懵,尤其后面直接使用 lambda 函数,让人不是很好理解。lambda 函数还原成正常类,给大家着重解释一下这个方法:countMap.merge("java", 1, new BiFunction<Integer, Integer, Integer>() {
@Override
public Integer apply(Integer oldValue, Integer newValue) {
return Integer.sum(oldValue,newValue);
}
});
merge方法,如果 java这个值在 countMap中不存在,那么将会其对应的 value 设置为 1。java 在 countMap 中存在,则会调用第三个参数 remappingFunction 函数方法进行计算。remappingFunction 函数中,oldValue代表原先 countMap 中 java 的值,newValue代表我们设置第二个参数 「1」,这里我们将两者相加,刚好完成累加的需求。最后
Map 新增方法只会,两者代码区别。lambda 函数,不熟悉的话,其实比较难以理解代码。有道无术,术可成;有术无道,止于术
欢迎大家关注Java之道公众号
好文章,我在看❤️
评论
