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

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

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

getOrDefault 方法

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

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

forEach 方法

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

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

replaceAll 方法

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

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

例如如下:

  1. 1
    2
    3
  1. 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. 1
    2
    3
    4
    5
  1. V v = map.get(key);
    if (v == null)
    v = map.put(key, value);
  2.  
  3. return v;

示例代码如下:

  1. 1
    2
    3
    4
    5
    6
  1. 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. 1
    2
    3
    4
    5
  1. if (map.containsKey(key) && Objects.equals(map.get(key), value)) {
    map.remove(key);
    return true;
    } else
    return false;

示例代码如下:

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

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

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

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

示例代码如下

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

replace(K key, V value) 方法

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

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

示例代码如下:

  1. 1
    2
    3
    4
    5
    6
    7
    8
    9
  1. // 输出旧的值, a
    System.out.println(map.replace(1, "aa"));
    // 替换成功,输出新的值, aa
    System.out.println(map.get(1));
  2.  
  3. // 不存在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. 1
    2
    3
    4
    5
  1. if (map.get(key) == null) {
    V newValue = mappingFunction.apply(key);
    if (newValue != null)
    map.put(key, newValue);
    }

示例代码如下:

  1. 1
    2
    3
    4
    5
    6
    7
  1. map.computeIfAbsent(1, key -> key + " computed");
    // 存在key为1,则不进行计算,输出值 a
    System.out.println(map.get(1));
  2.  
  3. 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. 1
    2
    3
    4
    5
    6
    7
    8
  1. 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. 1
    2
    3
    4
    5
    6
    7
  1. map.computeIfPresent(1, (key, value) -> (key + 1) + value);
    // 存在key为1, 则根据旧的key和value计算新的值,输出 2a
    System.out.println(map.get(1));
  2.  
  3. 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. 1
    2
    3
    4
    5
    6
    7
  1. 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. 1
    2
    3
    4
    5
    6
  1. // 存在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. 如何在macOS下调整磁盘分区大小?

    可以在“macOS”下利用磁盘工具并且不抹掉主分区的情况下,随意更改磁盘分区大小的方法.“OS X”经过几次大版本升级以后,也改名为“macOS”,而且系统自带的“磁盘工具”无论是功能和界面也有很大的 ...

  2. 接口自动化--requests库封装

    前言 不管是自动化大佬还是自动化小白,都知道我们用python写接口自动化测试肯定是要用requests库来封装请求类的,下面就简单介绍下requests这个库 安装 一般都是直接采用pip命令安装: ...

  3. 汇编 JMP 详解

    汇编 JMP 详解 关键词说明 RVA: 相对虚拟地址(Relative Virtual Address),在内存中相对于PE文件装入地址的偏移位置,是一个相对地址. JMP 的 3 种类型 短跳转( ...

  4. 性能测试基础---SQL基础

    ·数据库相关: ·范式:NF.关系型数据库的设计规则. 范式总计有6种: 1NF\2NF\3NF\BCNF\4NF\5NF ·范式的实现是从低到高的,比如说首先要实现的就是1NF,才能继续实现2NF, ...

  5. PAT 乙级 1006.换个格式输出整数 C++/Java

    1006 换个格式输出整数 (15 分) 题目来源 让我们用字母 B 来表示“百”.字母 S 表示“十”,用 12...n 来表示不为零的个位数字 n(n < 1000),换个格式来输出任一个不 ...

  6. 201671030106 何启芝 实验十四 团队项目评审&课程学习总结

    项目 内容 这个作业属于哪个课程 >>2016级计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 >>实验十四 团队项目评审&课程学习总结 课程学习目 ...

  7. 201671030122 杨凡亿 实验十四 团队项目评审&课程学习总结

    项目 内容 课程名称 2016级计算机科学与工程学院软件工程(西北师范大学) 作业要求 实验十四 团队项目评审&课程学习总结 课程学习目标 (1)掌握软件项目评审会流程(2)反思总结课程学习内 ...

  8. ssm批量删除

    ssm批量删除 批量删除:顾名思义就是一次性删除多个.删除是根据前台传给后台的id,那么所谓批量删除,就是将多个id传给后台,那么如何传过去呢,前后台的交互该如何实现? 1.jsp页面,先选中所有的要 ...

  9. maven 查看依赖树结构命令mvn dependency:tree

    使用maven 管理项目的依赖,可以使用如下命令查看依赖树结构: mvn dependency:tree 如下图是使用idea的终端执行命令的局部图: 也可以使用如下命令将输出定向到某个文件,这样就可 ...

  10. vuex2 mapActions 报错 `unknown action type: xxxx`

    export const setBreadCrumb = ({ dispatch }, data) => { dispatch('SET_BREADCRUMB', data) } 当调用的时候报 ...