java中的map如何使用(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));创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!