最后针对上面这种一个键需要映射到多个值,其实还有一个更优秀的解决办法,使用 Google Guava 提供的新集合类型 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++); }这类代码是不是很熟悉?同样比较繁琐。
接下来我们可以使用 JDK8 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,这里我们将两者相加,刚好完成累加的需求。
最后这次主要从个人日常碰到三个场景出发,给大家对比了一下使用 JDK8 Map 新增方法只会,两者代码区别。
从上面可以很明显看出,使用新增方法之后,我们可以用很少的代码可以完成,整体看起来变得非常简洁。
不过 JDK8 之后很多方法都会用到 lambda 函数,不熟悉的话,其实比较难以理解代码。
不过也还好,我们只要在日常编码过程中,刻意去练习使用,很快就能上手。
最后,JDK8 还有许多好用方法,刻意简化代码开发,你可以在留言区推荐几个吗?
欢迎关注我的公众号:小黑十一点半,获得日常干货推送。如果您对我的专题内容感兴趣,也可以关注我的博客:studyidea.cn