JAVA里Map的一些常用方法
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里Map的一些常用方法的更多相关文章
- java中Map集合的常用方法 (转)
原文地址:https://www.cnblogs.com/xiaostudy/p/9510763.html Map集合和Collection集合的区别 Map集合是有Key和Value的,Collec ...
- java中Map集合的常用方法
Map集合和Collection集合的区别 Map集合是有Key和Value的,Collection集合是只有Value. Collection集合底层也是有Key和Value,只是隐藏起来. V p ...
- Java中Map常用方法总结以及遍历方式的汇总
一.整理: 看到array,就要想到角标. 看到link,就要想到first,last. 看到hash,就要想到hashCode,equals. 看到tree,就要想到两个接口.Comparable, ...
- Java之Map接口(双列集合)
Map集合概述 现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射.Java提供了专门的集合类用来存放这种对象关系的对 ...
- Java中map接口 遍历map
转自:https://www.cnblogs.com/wjk921/p/4918442.html java集合框架用于存储数据,也被称为集合类 位于java.util包下 java.util包下常用接 ...
- jmap命令(Java Memory Map)(转)
JDK内置工具使用 一.javah命令(C Header and Stub File Generator) 二.jps命令(Java Virtual Machine Process Status To ...
- json格式字符串与java.util.Map的互转(借助于jackson.jar)
package com.test.javaAPI.json; /** * json工具类 * * @author Wei * @time 2016年10月2日 下午4:25:25 */ public ...
- 转:JAVA里面的int类型 和Integer类型,有什么不一样
JAVA里面的int类型 和Integer类型,有什么不一样 原文链接:http://blog.csdn.net/wuxinliulei/article/details/11099565 java.l ...
- eclipse出现错误:he type java.util.Map$Entry cannot be resolved. It is indirectly referenced
eclipse出现错误:he type java.util.Map$Entry cannot be resolved. It is indirectly referenced jre 换成6的就好了选 ...
- map集合的常用方法
package test; import java.util.Collection; import java.util.HashMap; import java.util.Map; import ja ...
随机推荐
- 2.第一篇 k8s组件版本及功能简介
文章转载自:https://mp.weixin.qq.com/s?__biz=MzI1MDgwNzQ1MQ==&mid=2247483772&idx=1&sn=a693d8a9 ...
- Beats: Filebeat和pipleline processors
简要来说: 使用filebeat读取log日志,在filebeat.yml中先一步处理日志中的个别数据,比如丢弃某些数据项,增加某些数据项. 按照之前的文档,是在filebeat.yml中操作的,具体 ...
- k8s中安装redis6集群
注意:第二步不用操作了,yaml文件仅供参考 1.创建Namespace kubectl apply -f Namespace.yaml apiVersion: v1 kind: Namespace ...
- Prometheus监控Nginx
转载自:https://www.cnblogs.com/you-men/p/13173245.html CentOS7.3 prometheus-2.2.1.linux-amd64.tar.gz ng ...
- Logstash:为 Logstash 日志启动索引生命周期管理
文章转载自:https://elasticstack.blog.csdn.net/article/details/110816948
- host主机监控规则
1.先在 Prometheus 主程序目录下创建rules目录,然后在该目录下创建 host.yml文件,内容如下: 内容很多,可以根据实际情况进行调整. 规则参考网址:https://awesome ...
- img和div之间有间隙的原因及解决方法
div 中 存在 img标签,由于img标签的 display:inline-block 属性. #####display:inline-block布局的元素在chrome下会出现几像素的间隙,原因是 ...
- 一个 dubbo 和 springboot 的兼容性问题
背景介绍 最近把dubbo的版本从2.7.3升级到2.7.15时,遇到一个报错 No application config found or it's not a valid config! ,对应的 ...
- CentOS 7.9 安装 rocketmq-4.9.2
一.CentOS 7.9 安装 rocketmq-4.9.2 地址: https://rocketmq.apache.org https://github.com/apache/rocketmq ht ...
- vue路由守卫用于登录验证权限拦截
vue路由守卫用于登录验证权限拦截 vue路由守卫 - 全局(router.beforeEach((to, from, next) =>来判断登录和路由跳转状态) 主要方法: to:进入到哪个路 ...