首页 > 编程语言 >Java——Map.getOrDefault方法和MapUtils.getXXX()详解

Java——Map.getOrDefault方法和MapUtils.getXXX()详解

时间:2023-11-27 21:01:48浏览次数:29  
标签:Map 默认值 Java map MapUtils 键值 getOrDefault null

在Java编程中,Map是一种非常常用的数据结构。Map通常用于存储键值对,其中每个键映射到一个值。当我们尝试访问一个不存在的键时,Map会返回null值。这在某些情况下可能会导致错误,因此Java 8引入了一个新的方法getOrDefault(),该方法可用于解决这个问题。

getOrDefault()方法的语法如下:

该方法接受两个参数:要查找的键和默认值。如果键存在,则返回与该键关联的值,否则返回指定的默认值。

需要注意的是,如果我们设置的默认值不是Map中存储的值的类型,则会抛ClassCastException异常。

default V getOrDefault(Object key, V defaultValue) {
    V v;
    return (((v = get(key)) != null) || containsKey(key))
        ? v
        : defaultValue;
}

当使用Map集合时,如果我们尝试访问一个不存在的键,则会返回一个null值,这在某些情况下可能会导致错误。使用Map的getOrDefault()方法可以解决这个问题。

使用getOrDefault()方法

public static void main(String[] args) {

    // 创建一个Map对象
    Map<String, Object> map = new HashMap<>();

    // 添加键值对到Map中
    map.put("a", "1");
    map.put("c", null);

    // 获取键为【a】的值
    System.out.println(map.getOrDefault("a", "aaa"));
    // 获取键为【b】的值
    System.out.println(map.getOrDefault("b", "2"));
    // 获取键为【c】的值
    System.out.println(map.getOrDefault("c", "3"));

}

运行结果

1
2
null

在上面的示例中

由于键”a“存在于Map中,所以返回”a“的键值为1

由于键”b“不存在于Map中,所以返回默认值为2

由于键”c“存在于Map中,所以返回”c“的键值为null

使用getOrDefault()方法已经满足了大多数情况的使用

但是你会发现另外一个问题,例如键”c“,当map的值为null时,获取键值依旧是返回null,一些情况下仍会造成错误异常

因为:getOrDefault的默认值的生效条件并不是get的值为null,而是containsKey的结果为false

解决这个问题可以使用MapUtils.getXXX(Map<K, V> map, K key, V defaultValue),

我们的Map类型是<String, Object>所有这里我们使用MapUtils.getObject()方法,此方法源码如下

第一个参数:要获取键值的map集合;第二个参数:要获取键值的键key;第三个参数:当map的值为null时,使用的默认值

public static <K, V> V getObject(Map<K, V> map, K key, V defaultValue) {
    if (map != null) {
        V answer = map.get(key);
        if (answer != null) {
            return answer;
        }
    }

    return defaultValue;
}

使用MapUtils.getObject()方法,还是上面的例子

import org.apache.commons.collections4.MapUtils;

public static void main(String[] args) {

    // 创建一个Map对象
    Map<String, Object> map = new HashMap<>();

    // 添加键值对到Map中
    map.put("a", "1");
    map.put("c", null);

    // 获取键为【a】的值
    System.out.println(map.getOrDefault("a", "aaa"));
    // 获取键为【b】的值
    System.out.println(map.getOrDefault("b", "2"));
    // 获取键为【c】的值
    System.out.println(map.getOrDefault("c", "3"));

    System.out.println(MapUtils.getObject(map, "c", "3"));
}

运行结果

1
2
null
3

在上面的示例中

map.getOrDefault方法获取map键为“c”的值,值为:null

MapUtils.getObject()方法获取map键为“c”的值,值为null则使用默认值“3”

综上测试,map.getOrDefault()方法和MapUtils.getObject()方法均可避免一些键值异常的发生,具体使用请参照具体业务使用,有时map的value为null就是要取null,有时候则需要设置默认值


标签:Map,默认值,Java,map,MapUtils,键值,getOrDefault,null
From: https://blog.51cto.com/u_16305703/8588434

相关文章

  • 在Linux系统上部署Java开发环境
    简介Java是一门跨平台的编程语言,可以在各种操作系统上运行。在Linux系统上部署Java开发环境,可以让开发人员在Linux系统上进行Java开发、编译、运行和调试。环境准备在部署Java开发环境之前,需要准备以下环境:一台Linux系统的服务器或虚拟机一个终端工具,如SSH一个文件传输工......
  • java基础学习:三元运算符,运算符的优先级
    三元运算符介绍:格式:条件表达式?值1:值2;执行流程:首先计算关系表达式的值,如果值为true,返回值1,如果值为false,返回值2代码:packagecom.itheima.operator;publicclassOperator6{publicstaticvoidmain(String[]args){//目标:三元运算符的基本使用do......
  • java基础学习:逻辑运算符
    &:前后均为true,结果才为true|:只要多个条件中有一个为true,结果就是true^(逻辑异或):前后结果相同时返回false,结果不同时返回true  &&(短路与):左边为false,右边则不执行||(短路或):左边为true,右边就不执行......
  • java基础学习:关系运算符
     判断相当用“==”双等于号packagecom.itheima.operator;publicclassQperator4{publicstaticvoidmain(String[]args){inta=10;intb=5;System.out.println(a=b);//输出结果为5,因为把b值为5赋值给了a}}......
  • 【Java - 图形界面设计】窗体 && 组件 && 事件
    窗体窗体对象JFramepackagecom.EveX.frame;importjavax.swing.*;publicclassFrameTest{publicstaticvoidmain(String[]args){/*创建窗体*/JFrameframe=newJFrame();/*设置窗体大小,参数宽和高,单位:像素*/frame.set......
  • 【开源】基于JavaWeb的网上药店系统
    一、摘要1.1项目介绍基于JAVA+Vue+SpringBoot+MySQL的网上药店系统,包含了药品类型模块、药品档案模块、药品收藏模块、药品订单模块、药品资讯模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,网上药店系统基......
  • 【开源】基于JavaWeb的活动推荐系统
    一、摘要1.1项目介绍基于JAVA+Vue+SpringBoot+MySQL的用户画像活动推荐系统,使用了协同推荐算法,包含了标签管理、活动档案、活动收藏、活动报名、活动留言模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,用户......
  • Caused by: io.debezium.DebeziumException: java.sql.SQLSyntaxErrorException: Acce
    1.情景展示如上图所示:在使用debezium读取mysql数据操作日志时(io.debezium.connector.mysql.MySqlConnector),报错:Causedby:io.debezium.DebeziumException:java.sql.SQLSyntaxErrorException:Accessdenied;youneed(atleastoneof)theRELOADprivilege(s)forthis......
  • JAVAWEB之文件的上传下载
    文件上传:本篇文章使用的文件上传的例子使用的都是原生技术,servelt+jdbc+fileupload插件,这也是笔者的习惯,当接触到某些从未接触过的东西时,总是喜欢用最原始的东西将他们表达出来。下面是具体的步骤,大家可以跟着我一步一步的用apache的fileupload插件来完成文件的上传下载。1.创......
  • Map和模糊查询
    Map在UserDao接口中intAddUser2(Map<String,Object>map);UserMapper.xml<insertid="AddUser2"parameterType="map">insertintouser.use1(id,name,pwd)values(#{UserId},#{UserName},#{password});</insert>......