教你更优雅的写法处理null检查

2023-11-18

回顾以前对null的处理方式

public class OptionalTest {
    public static void main(String[] args) {
        test01("小黑");
        test01(null);
    }

    public static void test01(String userName) {
        if (userName != null) {
            System.out.println("用户名为: " + userName);
        } else {
            System.out.println("用户名为null");
        }
    }
}

Optional类介绍

Optional是JDK1.8推出的一个新的类,是一个没有子类的工具类,Optional可以理解为一个容器,其内部仅能存放一个对象元素或者存放null。它的作用主要就是为了解决避免Null检查,防止NullPointerException。

Optional的基本使用

Optional类的创建方式:

方法 说明
Optional.of(T t) 创建一个 Optional 实例,内部保存t对象,如果t为null会出现空指针异常
Optional.empty() 创建一个空的 Optional 实例,内部保存null
Optional.ofNullable(T t) 若 t 不为 null,创建 Optional 实例,否则创建空实例

代码演示:

public static void test02() {
    Optional<String> o1 = Optional.of("小马");
    // Optional<String> o2 = Optional.of(null); // 如果t为null会出现空指针异常
    Optional<String> o3 = Optional.empty();
    Optional<String> o4 = Optional.ofNullable(null);
    System.out.println("o1 = " + o1);
    // System.out.println("o2 = " + o2);
    System.out.println("o3 = " + o3);
    System.out.println("o4 = " + o4);
}

运行效果:

o1 = Optional[小马]
o3 = Optional.empty
o4 = Optional.empty

Optional类的常用方法:

方法 说明
isPresent() 判断是否包含值,包含值返回true,不包含值返回false
get() 如果Optional有值则将其返回,否则抛出NoSuchElementException
orElse(T t) 如果调用对象包含值,返回该值,否则返回参数t
orElseGet(Supplier s) 如果调用对象包含值,返回该值,否则返回 s 获取的值

代码演示:

public static void test03() {
    Optional<String> o5 = Optional.of("小马");
    Optional<String> o6 = Optional.empty();
    Optional<String> o7 = Optional.ofNullable(null);

    // isPresent() : 判断是否包含值,包含值返回true,不包含值返回false。
    if (o5.isPresent()) {
        // get() : 如果Optional有值则将其返回,否则抛出NoSuchElementException。
        String userName = o5.get();
        System.out.println("用户名o5为:" + userName);
    } else {
        System.out.println("用户名o5为null");
    }

    if (o6.isPresent()) {
        String userName = o6.get();
        System.out.println("用户名o6为:" + userName);
    } else {
        System.out.println("用户名o6为null");
    }

    if (o7.isPresent()) {
        String userName = o7.get();
        System.out.println("用户名o7为:" + userName);
    } else {
        System.out.println("用户名o7为null");
    }
}

运行效果:

用户名o5为:小马
用户名o6为null
用户名o7为null

Optional的高级使用

代码演示:

public static void test04() {
    Optional<String> o8 = Optional.of("小程");
    Optional<String> o9 = Optional.empty();

    // 存在做的什么
    o8.ifPresent(s -> System.out.println("用户名o8为" + s));
    o9.ifPresent(s -> System.out.println("用户名o9为" + s));
}

public static void test05() {
    Optional<String> o10 = Optional.of("小序");
    Optional<String> o11 = Optional.empty();

    // 如果调用对象包含值,返回该值,否则返回参数
    System.out.println("用户名o10为: " + o10.orElse("不存在数据10"));
    System.out.println("用户名o11为: " + o11.orElse("不存在数据11"));

    // 如果调用对象包含值,返回该值,否则返回参数Supplier得到的值
    String s10 = o10.orElseGet(() -> {return "未知用户名10";});
    System.out.println("s10 = " + s10);

    String s11 = o11.orElseGet(() -> {return "未知用户名11";});
    System.out.println("s11 = " + s11);
}

运行效果:

用户名o8为小程
用户名o10为: 小序
用户名o11为: 不存在数据11
s10 = 小序
s11 = 未知用户名

总结

Optional可以理解为一个容器,其内部仅能存放一个对象元素或者存放null。它的作用主要就是为了解决避免Null检查,防止NullPointerException。OptionalorElseifPresentorElseGet等方法避免对null的判断,写出更加优雅简洁的代码。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

教你更优雅的写法处理null检查 的相关文章

随机推荐

  • Android studio 查找所有字符串

    查找程序中所有直接使用的硬编码字符串 String 全局查找 Ctrl H 输入 u4e00 u9fa5 并打钩Regular Expression 正则表达式
  • 语音识别-3

    https zhuanlan zhihu com p 33464788 基于CTC的语音识别基础与实现 首先明确语音识别的任务是怎样的 输入input是音频wav文件 保存的一般是经过抽样量化编码之后数字信号 也就是每个样点的值 即我们经常
  • Python人工智能需要学什么?Python人工智能有什么用

    python人工智能是python开发中最火也是学习要求最高 薪资最高的方向 所以很多的小伙伴都想知道学习python人工智能要学一些什么 python人工智能有什么用 这篇文章会介绍python人工智能的全学习路线和作用 一起看看吧 一
  • 获取京东cookie简单暴力获取京东CK

    获取京东cookie简单暴力获取京东CK 具有时效性 太久没玩可能以失效 注意 用浏览器请使用隐身窗口 如果多个账号 一定不要点退出登录 直接关闭网页 清除浏览器cookie数据 隐身窗口无需这一步 重新进入网页登录下一个账号 退出会导致刚
  • SpringBoot通过@Cacheable实现redis缓存机制

    SpringBoot通过注解实现redis缓存机制 Cacheable 查询 CachePut 修改 CacheEvict 删除 下面展示一些 内联代码片 Cacheable 查询 An highlighted block key 这边以d
  • 转虚拟服务器要输入什么,虚拟主机转移到云服务器要注意哪些

    虚拟主机转移到云服务器要注意哪些 发布时间 2020 10 09 17 08 53 来源 亿速云 阅读 62 作者 Leah 栏目 云计算 虚拟主机转移到云服务器要注意哪些 针对这个问题 这篇文章详细介绍了相对应的分析和解答 希望可以帮助更
  • 【VUE】vue安装教程

    vue js环境搭建 1 安装node js 官网地址 https nodejs org en 最好安装最新版的node js 2 安装node js 注意 在安装Node js前 先cmd 命令提示符 运行 node v 查看是否已经有N
  • AD——绘制STC89C51单片机原理图

    AltiumDesigner绘制STC89C51单片机原理图
  • build VCL on android

    转自 http wiki videolan org AndroidCompile AndroidCompile This page is an introduction to the compilation of VLC for Andro
  • vue首屏优化

    先分析加载慢的原因 再做优化 1 首先安装webpack的可视化资源分析工具 命令行执行 npm i webpack bundle analyzer D 2 然后在webpack的dev开发模式配置中 引入插件 代码如下 const Bun
  • 微信小程序-input标签无法输入数据问题

    使用微信开发者工具学习时 input标签点击之后鼠标无法跳转 也无法输入数据 解决方案 直接单击键盘的 Tab键即可跳入输入框 鼠标未在输入框内 按一下Tab键也可跳入
  • Vue脚手架相关笔记(ref属性、props配置、mixin混入、scoped样式)

    关于不同版本的Vue 1 vue js 与vue runtime xxx js的区别 1 vue js是完整版的Wue 包含 核心功能 模板解析器 2 vue runtime xxx js是运行版的Vue 只包含 核心功能 没有模板解析器
  • Sysrv-hello挖矿病毒

    麻蛋我的服务器也中了这个挖矿病毒 先看一下网上能找到的文章吧 https developer aliyun com article 780758 讲了一大堆原理 你倒是给我解决办法啊 1 先杀了进程 sysrv network01 2 修改
  • H5打开新窗口与页面跳转的几种方法

    1 在本窗体打开一个新的页面 window location href URL 2 在一个新的窗口打开一个新的页面 window open URL 3 本窗口的页面被替换为一个新的页面URL 替换后不可以回退到上个页面 location r
  • 理光打印机出现sc542-01怎样解决?

    问题图 步骤一图文 补充 理光维修模式指令 107 03以下机型 143 通用 806182 03以上机型 注方法 1 清除键 黄色 点一次 107 停止键 红色键 按住3秒以上 2 依次按重置 RESET 806182 按住C不动3秒 就
  • CentOS7.5最小化安装之后的配置

    我是最小化安装的 安装了之后很多基本使用配置没有 接下来要做一些配置 如网络之类的 使系统可用 1 使命令分页显示 1页显示不不下 又不能上翻页 xxx more 2 查看系统安装了哪些软件包 rpm qa 3 配置网络 最小化安装之后 i
  • 听我一句劝,别去外包,干了3个月,技术退步明显...

    先说一下自己的情况 大专生 18年通过校招进入湖南某软件公司 干了接近4年的功能测试 今年年初 感觉自己不能够在这样下去了 长时间呆在一个舒适的环境会让一个人堕落 而我已经在一个企业干了四年的功能测试 已经让我变得不思进取 谈了2年的女朋友
  • 一种关于单片机定时器中断和数码管冲突问题的解决方案

    问题发现 我们会发现 同时存在定时器中断和数码管操作时 有时会导致数码管显示异常 原因探究 在定时器中断函数中不要操作P2和P0 因为定时器 T 和主板 M 的时钟频率不一样 有可能导致M刚操作完P2 T又去操作P0 导致正确的P2和P0没
  • Windows从命令行创建文本文件的两种方式

    第一种方式 copy con 文件名 然后可以输入文件内容 完成后打Ctrl Z退出 输入的内容被保存为一个文件 第二种 如下 echo gt 文件名 创建一个空的文件 当然你可以创建任何后缀名的文本类文件 创建一个SQL文件也是没问题的
  • 教你更优雅的写法处理null检查

    回顾以前对null的处理方式 public class OptionalTest public static void main String args test01 小黑 test01 null public static void te