在Java 8中的Map.Entry接口中增加了comparingByKeycomparingByValue方法,它们都返回Comparator<Map.Entry<K,V>>Comparator是一个函数接口,主要是方便Lambda表达式的使用。

在Java 8中的Map接口增加了一些default方法,提升了对key, value操作的便利性。下面是基本数据的定义,通过这些数据说明新增的一些方法。

1
2
3
4
Map<Integer, String> map = new HashMap<>();
map.put(1, "a");
map.put(2, "b");
map.put(3, "c");

getOrDefault 方法

如果指定的key存在,则返回该key对应的value,如果不存在,则返回指定的值。例子如下

1
2
// key为4不存在,输出 d
System.out.println(map.getOrDefault(4, "d"));

forEach 方法

遍历Map中的所有Entry, 对key, value进行处理, 接收参数 (K, V) -> void, 例子如下

1
2
// 输出1a, 2b, 3c
map.forEach((key, value) -> System.out.println(key + value));

replaceAll 方法

替换Map中所有Entry的value值,这个值由旧的key和value计算得出,接收参数 (K, V) -> V, 类似如下代码

1
2
for (Map.Entry<K, V> entry : map.entrySet())
entry.setValue(function.apply(entry.getKey(), entry.getValue()));

例如如下:

1
2
3
map.replaceAll((key, value) -> (key + 1) + value);
// 输出 12a 23b 34c
map.forEach((key, value) -> System.out.println(key + value));

putIfAbsent 方法

如果key关联的value不存在,则关联新的value值,返回key关联的旧的值,类似如下代码

1
2
3
4
5
V v = map.get(key);
if (v == null)
v = map.put(key, value); return v;

示例代码如下:

1
2
3
4
5
6
map.putIfAbsent(3, "d");
map.putIfAbsent(4, "d");
// 输出 c
System.out.println(map.get(3));
// 输出 d
System.out.println(map.get(4));

remove 方法

接收2个参数,key和value,如果key关联的value值与指定的value值相等(equals),则删除这个元素,类似代码如下:

1
2
3
4
5
if (map.containsKey(key) && Objects.equals(map.get(key), value)) {
map.remove(key);
return true;
} else
return false;

示例代码如下:

1
2
3
4
5
6
7
map.remove(1, "b");
// 未删除成功, 输出 a
System.out.println(map.get(1)); map.remove(2, "b");
// 删除成功,输出 null
System.out.println(map.get(2));

replace(K key, V oldValue, V newValue) 方法

如果key关联的值与指定的oldValue的值相等,则替换成新的newValue,类似代码如下:

1
2
3
4
5
if (map.containsKey(key) && Objects.equals(map.get(key), value)) {
map.put(key, newValue);
return true;
} else
return false;

示例代码如下

1
2
3
4
5
6
7
map.replace(3, "a", "z");
// 未替换成功,输出 c
System.out.println(map.get(3)); map.replace(1, "a", "z");
// 替换成功, 输出 z
System.out.println(map.get(1));

replace(K key, V value) 方法

如果map中存在key,则替换成value值,否则返回null, 类似代码如下:

1
2
3
4
if (map.containsKey(key)) {
return map.put(key, value);
} else
return null;

示例代码如下:

1
2
3
4
5
6
7
8
9
// 输出旧的值, a
System.out.println(map.replace(1, "aa"));
// 替换成功,输出新的值, aa
System.out.println(map.get(1)); // 不存在key为4, 输出 null
System.out.println(map.replace(4, "d"));
// 不存在key为4, 输出 null
System.out.println(map.get(4));

computeIfAbsent 方法

如果指定的key不存在,则通过指定的K -> V计算出新的值设置为key的值,类似代码如下:

1
2
3
4
5
if (map.get(key) == null) {
V newValue = mappingFunction.apply(key);
if (newValue != null)
map.put(key, newValue);
}

示例代码如下:

1
2
3
4
5
6
7
map.computeIfAbsent(1, key -> key + " computed");
// 存在key为1,则不进行计算,输出值 a
System.out.println(map.get(1)); map.computeIfAbsent(4, key -> key + " computed");
// 不存在key为4,则进行计算,输出值 4 computed
System.out.println(map.get(4));

computeIfPresent 方法

如果指定的key存在,则根据旧的key和value计算新的值newValue, 如果newValue不为null,则设置key新的值为newValue, 如果newValue为null, 则删除该key的值,类似代码如下:

1
2
3
4
5
6
7
8
if (map.get(key) != null) {
V oldValue = map.get(key);
V newValue = remappingFunction.apply(key, oldValue);
if (newValue != null)
map.put(key, newValue);
else
map.remove(key);
}

示例代码如下:

1
2
3
4
5
6
7
map.computeIfPresent(1, (key, value) -> (key + 1) + value);
// 存在key为1, 则根据旧的key和value计算新的值,输出 2a
System.out.println(map.get(1)); map.computeIfPresent(2, (key, value) -> null);
// 存在key为2, 根据旧的key和value计算得到null,删除该值,输出 null
System.out.println(map.get(2));

compute 方法

compute方法是computeIfAbsentcomputeIfPresent的综合体。

merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction) 方法

如果指定的key不存在,则设置指定的value值,否则根据key的旧的值oldvalue,value计算出新的值newValue, 如果newValue为null, 则删除该key,否则设置key的新值newValue。类似如下代码:

1
2
3
4
5
6
7
V oldValue = map.get(key);
V newValue = (oldValue == null) ? value :
remappingFunction.apply(oldValue, value);
if (newValue == null)
map.remove(key);
else
map.put(key, newValue);

示例代码如下:

1
2
3
4
5
6
// 存在key为1, 输出 a merge
System.out.println(map.merge(1, " merge", (oldValue, newValue) -> oldValue + newValue));
// 新值为null,删除key,输出 null
System.out.println(map.merge(1, " merge", (oldValue, newValue) -> null));
// 输出 " merge"
System.out.println(map.merge(4, " merge", (oldValue, newValue) -> oldValue + newValue));

Java 8之Map新增方法<转>的更多相关文章

  1. Java中迭代Map的方法

    Map<String, String> mapServlet = new HashMap<String, String>(); System.out.println(" ...

  2. Java compiler level does not match the version of the installed Java project facet. map解决方法

    右键项目"Properties",在弹出的"Properties"窗口左侧,单击"Project Facets",打开"Proje ...

  3. 谈谈java中遍历Map的几种方法

    java中的map遍历有多种方法,从最早的Iterator,到java5支持的foreach,再到java8 Lambda,让我们一起来看下具体的用法以及各自的优缺点 先初始化一个map public ...

  4. java中遍历Map几种方法

    java中的map遍历有多种方法,从最早的Iterator,到java5支持的foreach,再到java8 Lambda,让我们一起来看下具体的用法以及各自的优缺点. 先初始化一个map: publ ...

  5. jdk8中map新增的merge方法介绍

    1.Map.merge方法介绍 jdk8对于许多常用的类都扩展了一些面向函数,lambda表达式,方法引用的功能,使得java面向函数编程更为方便.其中Map.merge方法就是其中一个,merge方 ...

  6. Java中遍历Map集合的四种方法

    在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...

  7. Java中遍历Map的几种方法

      转自: http://blog.csdn.net/wzb56/article/details/7864911 方法分为两类: 一类是基于map的Entry:map.entrySet(); 一类是基 ...

  8. java中遍历map对象的多种方法

    在Java中如何遍历Map对象   How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有ma ...

  9. java中遍历MAP,嵌套map的几种方法

    java中遍历MAP的几种方法 Map<String,String> map=new HashMap<String,String>();    map.put("us ...

随机推荐

  1. 算法——dfs 判断是否为BST

    95. 验证二叉查找树 中文English 给定一个二叉树,判断它是否是合法的二叉查找树(BST) 一棵BST定义为: 节点的左子树中的值要严格小于该节点的值. 节点的右子树中的值要严格大于该节点的值 ...

  2. SDOI2012 走迷宫

    走迷宫 Morenan被困在了一个迷宫里.迷宫可以视为N个点M条边的有向图,其中Morenan处于起点S,迷宫的终点设为T.可惜的是,Morenan非常的脑小,他只会从一个点出发随机沿着一条从该点出发 ...

  3. 【Java】Springboot集成Druid

    Springboot集成Druid方案:一个是在POM中直接配置druid-spring-boot-starter,不用写任何代码:一个是配置druid,写几行代码,可以加入:在方案一基础上加入sta ...

  4. 怎么避免写bug?

    1:关注可能的业务逻辑异常:业务逻辑异常 可以通过各种输入输出 和 预期进行比较 即可很快发现. 2:关注可能的运行逻辑异常: 如 copy对象: 对象引用等 这类异常只看代码逻辑时很难发现的:代码写 ...

  5. TCP拥塞避免

    目录 TCP拥塞避免 超时重传机制 拥塞控制 慢启动 拥塞避免 快重传 快恢复 与流量控制区别 参考 TCP拥塞避免 拥塞控制就是防止过多的数据注入网络中,这样可以使网络中的路由器或链路不致过载.拥塞 ...

  6. react-native 在iOS上使用http链接的图片地址不显示| iOS9 & iOS10 HTTP 不能正常使用的解决办法

    https://segmentfault.com/a/1190000002933776 今天升级Xcode 7.0 bata发现网络访问失败.输出错误信息 The resource could not ...

  7. async 珠峰培训node正式课笔记 【async】任务流程控制,异步流程控制

    var async = require('async'); // series 串形任务 console.time('cost') async.series({ two:function(callba ...

  8. sql server 性能优化的几个专家工具

    以下为一个方便的sql server 分析的专家工具 sp_WhoIsActive 提供了方便的文档说明 参考网站 http://whoisactive.com/docs/ dba_BlockTrac ...

  9. K8s无状态控制器原理介绍

    Pod控制器: ReplicationController:早期K8s只有这一个控制器,但后来发现让这一个来完成所有任务,太复杂.因此被废弃. ReplicaSet: 它用于帮助用户创建指定数量的Po ...

  10. ARC096 E Everything on It [容斥,斯特林数]

    Atcoder 一个900分的题耗了我这么久--而且官方题解还那么短--必须纪念一下-- 思路 发现每种元素必须出现两次以上的限制极为恶心,所以容斥,枚举出现0/1次的元素个数分别有几个.设出现1次的 ...