千家信息网

java.util.Optional怎么使用

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍"java.util.Optional怎么使用",在日常操作中,相信很多人在java.util.Optional怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希
千家信息网最后更新 2026年11月03日java.util.Optional怎么使用

这篇文章主要介绍"java.util.Optional怎么使用",在日常操作中,相信很多人在java.util.Optional怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"java.util.Optional怎么使用"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

第一种. Optional.of(Object object):入参object不能为空,否则会抛出空指针异常,查看Optional源码发现会调用Objects.requireNonNull方法,里面有判空:

public static  T requireNonNull(T obj) {        if (obj == null)            throw new NullPointerException();        return obj;    }

第二种. Optional.ofNullable(Object object):入参object可以为空,如果object不为空,就创建一个Optional实例;如果object为空就返回一个static fainal的Option对象,注意这里不会新建Option实例,而是使用一个static final的实例EMPTY,这里比较有意思的是泛型的问题,例如我需要两个Optional对象,类型分别是String和Integer,代码如下:

Optional optionalStr = Optional.ofNullable(null);Optional optionalInt = Optional.ofNullable(null);

类型不同又如何保证返回同一个对象呢?直接看ofNullable的源码,发现会调用empty方法:

public static Optional empty() {        @SuppressWarnings("unchecked")        Optional t = (Optional) EMPTY;        return t;    }

原来是通过强制转换实现的,再看EMPTY对象:

private static final Optional EMPTY = new Optional<>();

是通过"?"声明的;

第三种. Optional.empty():就是上面分析Optional.ofNullable的时候用到的empty方法,直接返回一个static final的实例EMPTY;

Optional.of()方法的用法有点像断言,对象为空的时候代表着某种业务上不可接受的异常,需要尽早处理,并且业务拒绝执行,这种场景下可以使用Optional.of;

接下来我们开始实战吧;

###例子中用到的对象:Student### Student是个普通的bean,有三个字段和对应的get&set方法

package com.bolingcavalry;/** * @author willzhao * @version V1.0 * @Description: 一个普通的bean * @email zq2599@gmail.com * @Date 2017/8/26 下午11:23 */public class Student {    private int id;    private String name;    private int age;    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public Student(int id, String name, int age) {        this.id = id;        this.name = name;        this.age = age;    }}

###Optional.ofNullable的用法### 下面举例说明最常用的Optional.ofNullable,我们打算根据名称从其他系统获取student对象,如果对象为空就返回默认对象,先看不用Optional的时候我们平常是怎么写的,如下代码所示,标准的if&else判断:

  private Student queryById(int id){        //TODO 这里模拟从数据库查询        return null;    }    public Student getStudent(int id){        Student student = queryById(id));        //如果为空就返回DEFAULT对象        return student==null ? DEFAULT : student;    }

用Optional之后,如下所示,不需要通过判空来避免空指针异常了:

private Student queryById(int id){        //TODO 这里模拟从数据库查询        return null;    }        public Student getStudent(int id){        Optional optional = Optional.ofNullable(queryById(id));        //如果为空就返回DEFAULT对象        return optional.orElse(DEFAULT);    }

orElse方法可以指定一个value为空时的返回对象,如果这个对象需要调用方法才能获取(例如我们拿不到DEFAULT对象,要通过getDefault()方法才能拿到),这是就需要orElseGet方法来达到目的,如下:

private Student queryById(int id){        //TODO 这里模拟从数据库查询    return null;}private Student getDefault(){        return DEFAULT;}public Student getStudent(int id){        Optional optional = Optional.ofNullable(queryById(id));        //如果为空就返回DEFAULT对象    return optional.orElseGet(() -> getDefault());}

###Optional的map方法### 假如我们的需求是student对象非空就返回name的大写,如果student对象为空就返回"invalid",在没有Optional的时候写法如下,除了检查student变量是否为空,还要检查name是否为空:

private Student queryById(int id){        //TODO 这里模拟从数据库查询        return null;}public String getStudentUpperName(int id){        Student student = queryById(id);        if(student!=null && student.getName()!=null){                return student.getName().toUpperCase();    }    return "invalid";}

用了Optional可以这么写:

private Student queryById(int id){        //TODO 这里模拟从数据库查询        return null;}public String getStudentUpperName(int id){        Optional optional = Optional.ofNullable(queryById(id));    return optional.map(student -> student.getName())                   .map(name -> name.toUpperCase())                   .orElse("invalid");}

由以上代码可以看到,map可以将一个Optional对象转换成另一个,第一次是将Optional转换成了Optional,第二次是将Optional转成了另一个Optional,只是这次将字符串换成了大写;

本次实战的源码已经上传到git上,地址是git@github.com:zq2599/blog_demos.git,里面有多个工程,本次用到的是optionaldemo,如下图红框所示:

到此,关于"java.util.Optional怎么使用"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

对象 方法 数据 数据库 查询 实例 时候 学习 代码 源码 普通 接下来 业务 大写 实战 指针 更多 类型 问题 帮助 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广州紫鲸互联网科技有限公司 科技赋能下的互联网金融 互联网巨头反垄断金融科技 互联网与科技发展 没上市的科技互联网公司 互联网与未来科技 凡科互联网科技 互联网金融 科技创新 长亮科技互联网金融 成都狮子座互联网科技 北京大学互联网科技怎么样 贵州叶脉互联网科技有限公司所属行业 阿大互联网科技有限公司 互联网科技股为什么大涨 下一代互联网重大应用科技园 互联网科技包装股份有限公司上市 宁波跨境商互联网科技有限公司 中国新注册互联网科技 广西泛欧互联网科技有限公司 宁波允成互联网科技有限公司 互联网科技公司税收优惠 互联网科技的发展 互联网科技公司有哪些 科技互联网创业计划书 互联网和高科技公司 互联网为啥属于高科技 黑科技 体验场景 互联网大会 江苏苏星互联网科技有限公司 济南小医互联网科技有限公司招聘 易租星互联网科技有限公司
0