【JAVA日常操作】JAVA里Map的一些常用方法
2023-03-31 10:42:22 时间
Map的常用方法
案例1
场景:一张建行用户体验金信息大表(百万级别),里面存在一个字段对多条数据,需要统计某个字段的多条数据累加值以供于别的服务调用。
优化前解决:直接查出来一个大list给到另一个服务,再另外一个服务里有笛卡尔积算出累加值(笛卡尔积后得到jvm需运算56亿次),程序直接接近崩溃,故需优化。
优化思路:首先由于该表是一张大表,所以我们不能直接把这百万级别轰到内存中(不然会OOM),我们先分组取出,分组迭代使用Map的Merge方法(源码如下),该方法接收了三个参数,一个是Key,一个是value,一个是remappingFunction,简单理解,如果给定的key不存在,它就变成了 put(key, value) ;但是,如果 key 已经存在一些值,我们 remappingFunction 可以选择合并的方式,然后将合并得到的 newValue 赋值给原先的 key。
// 源码如下
default V merge(K key, V value,
BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
Objects.requireNonNull(remappingFunction);
Objects.requireNonNull(value);
V oldValue = get(key);
V newValue = (oldValue == null) ? value :
remappingFunction.apply(oldValue, value);
if (newValue == null) {
remove(key);
} else {
put(key, newValue);
}
return newValue;
}
案例2
场景:逻辑需要移除map里特定的key和value元素
优化前解决:遍历找出对应条件,程序效率不高,很多无效判断
优化思路:使用map jdk1.8新增方法一步解决,remove方法,该方法有两个入参,一个是key,一个是value。基本理解,仅当指定的 key 关联到指定的 value 时,才删除指定的项,删除成功返回 true。
// 源码如下
default boolean remove(Object key, Object value) {
Object curValue = get(key);
if (!Objects.equals(curValue, value) ||
(curValue == null && !containsKey(key))) {
return false;
}
remove(key);
return true;
}
Map的另外一些新增方法示例
// 原有的Put方法,是当Key存在时则替换;而putIfAbsent方法,则是当存在Key忽略Put操作不替换
map.putIfAbsent("K1001", "K1001-1");
// 如果Key存在,则将函数的运算结果作为这个Key对应的Value的新值Put进去
map.computeIfPresent("K1001", (k, v) -> k + v);
// 如果Map中不存这个Key对应个的键值对,则Put这个Key和将Key带入函数运算后的结果为Value的键值对;如果Key存在,则忽略Put操作
map.computeIfAbsent("K1002", k -> k);
// 只有当Map中键值对同时等于参数Key和Value时才执行删除
map.remove("K1002", "K1002");
// 从Map中获取指定Key的Value的值,如果不存在则返回指定的默认值
String vle = map.getOrDefault("K1002", "V1002");
System.out.println(vle);
// 遍历 forEach
map.forEach((k, v) -> System.out.println(k + " --> " + v));
相关文章
- 我是如何理解Java抽象类和接口的
- 每个Java程序员必须知道的5个JVM命令行标志
- Java开发熟手该当心的11个错误
- 为什么Java字符串是不可变对象?
- 程序员如何偷懒?偷懒是一种至高境界
- 如何通过编程发现Java死锁
- 让你精通响应式网页设计的15条建议
- Java中关于异常处理的10个最佳实践
- Java程序员应当知道的10个面向对象设计原则
- 2015年3月编程语言排行榜:F#排名达到11
- Java读取文件夹大小的6种方法及代码
- Java知多少虚拟机(JVM)以及跨平台原理
- 甲骨文推出新版Java开发工具Java Development Kit 8
- 教你轻松读懂Java中的Socket编程
- 详解通过Canvas + JS 实现简易的时钟
- Java项目构建系统,Apache Buildr 1.4.22 发布
- Java中注释的使用是有原则的
- 爱上Java和JVM的10大理由
- 三个时尚而简约的HTML5按钮演示及源码
- 【博文推荐】ASP.NET MVC4+BootStrap实战