Optional的使用详解

news/2025/2/14 4:29:38/

工作中经常会调外部接口、或者查询表等,如果对返回结果不进行空指针判断的话就会导致空指针异常。针对这种情况经常会使用if进行判断:

    private boolean isNotNull(Object param) {if (param == null) {return false;} else {return true;}}

这样写其实功能上没有任何问题,但是如果需要判断的字段比较多,或者本身已经嵌套了多重循环或者判断,再加上这一层判断,代码就会变得非常臃肿,可读性非常差。

JDK1.8之后提出来Optional方法来解决这个问题,通过Optional方法,我们可以将上面的代码改造为以下方式:

    private boolean isNotNull1(Object param) {return Optional.ofNullable(param).isPresent();}

这样看起来是不是优雅了很多,当然仅仅判断一个简单的对象就使用这个方法是远远不够的,再具体的工作中,我经常遇到的更多是像下面的这种代码:

    public static void main(String[] args) {List<String> list = null;List<String> newList = Optional.ofNullable(list).orElse(new ArrayList());newList.forEach(x -> System.out.println(x));}

上面代码含义很简单:

如果list集合不为空,将list集合赋值给newList;如果list集合为空创建一个空对象集合赋值给newList,保证list集合永远不为空,也就避免了空指针异常。

下面我们看看底层是怎么处理的,怎么就避免了空指针呢?

首先看看.ofNullable方法源码:

private static final Optional<?> EMPTY = new Optional<>();private Optional() {this.value = null;
}//如果对象为空,执行empty();不为空,执行of(value)
public static <T> Optional<T> ofNullable(T value) {return value == null ? empty() : of(value);
}//empty()方法调用静态变量EMPTY生成一个空对象(不是null)
public static<T> Optional<T> empty() {@SuppressWarnings("unchecked")Optional<T> t = (Optional<T>) EMPTY;return t;
}//of()方法生成一个有值的对象
public static <T> Optional<T> of(T value) {return new Optional<>(value);
}

其本质就是一系列三目运算,首先执行ofNullable()方法,如果T对象为空,执行empty()方法;不为空,执行of(value)方法;

empty()方法,初始化一个空对象Optional

of(value)方法,将泛型对象T用于Optional构造方法的参数上,返回一个有值的对象

经过以上几步,从而保证了Optional不为null,避免了空指针;

接下来看看最常用的.isPresent()、.orElse()、.map()方法的源码以及如何使用

  • .isPresent()&.orElse()
//orElse
public T orElse(T other) {return value != null ? value : other;
}//isPresent
public boolean isPresent() {return value != null;
}
  • .map()
    public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {Objects.requireNonNull(mapper);if (!isPresent())return empty();else {return Optional.ofNullable(mapper.apply(value));}}

map方法中最后一行代码为Optional.ofNullable,这是返回的时候自动把返回值包装好了

下面我们看看具体如何使用,isPresent和orElse已经在上面的代码中有所体现,下面我们看看map是怎么使用的

public class Demo01 {public static void main(String[] args) {Teacher teacher1 = new Teacher();teacher1.setAddress("西湖");teacher1.setCity("杭州");
//使用mapString s1 = Optional.ofNullable(teacher1).map(tempTeacher -> tempTeacher.getAddress()).orElse("没有地址信息");System.out.printf(s1.toString());}
}class Teacher {private String address;private String city;public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}
}

我们看一下运行结果:
在这里插入图片描述

所以map的作用就是为了获取对象中的具体值,如果对象不为空就继续获取对象里的值并返回


http://www.ppmy.cn/news/62010.html

相关文章

数据结构 -- 共用体Union

在数据结构 -- 结构体Struct一文中详细介绍了结构体的定义以及内存对齐。在C语言中&#xff0c;还有另外一种和结构体非常类似的语法&#xff0c;叫做共用体&#xff08;Union&#xff09;&#xff0c;也称为联合体。它的定义格式为&#xff1a; union 共用体名{成员列表 };1. …

Alibaba技术官熬夜肝出的,Kafka “限量笔记” 牛掰 ~

前言 分布式&#xff0c;是程序员必备技能之一&#xff0c;在面试过程中属于必备类的&#xff0c;在工作中更是会经常用到。而Kafka是一个分布式的基于发布订阅的消息队列&#xff0c;目前它的魅力是无穷的&#xff0c;对于Kafka的奥秘&#xff0c;还需要我们细细去探寻。 要…

Echarts实现伪3D地图 + 自定义标准的实现小记

仅作为记录&#xff0c;欢迎参考&#xff0c;不喜勿喷 <template><v-chart :option"option" autoresize></v-chart> </template><script> import { mapState } from vuex; import { use, registerMap } from echarts/core; import { …

系统运维(Git篇)

Git基础 Git Git是一种分布式版本控制系统&#xff0c;可以帮助我们管理代码的版本和变更。通过学习Git&#xff0c;我们可以更好地理解版本控制的原理和应用&#xff0c;同时也可以掌握Git的使用和管理技巧。 Docker Docker是一种容器化平台&#xff0c;可以将应用程序及其依赖…

Go语言中的流程控制语句

目录 流程控制语句 if语句 ifelse语句 switch语句 for循环 break语句 continue语句 goto语句 流程控制语句 if语句 在Go语言中&#xff0c;可以在if后面加上一段执行语句&#xff0c;执行语句也可以用作对if条件的判断。它的语法格式为&#xff1a; if a : conditio…

随笔-听说你年入百万了

两个月前接到老代的电话&#xff0c;说4月30号结婚&#xff0c;预约一下时间。半个月前接到小付的电话&#xff0c;说5月1号结婚&#xff0c;行吧&#xff0c;值当回趟老家了。 抢票还算顺利&#xff0c;转了一趟车&#xff0c;29号下午到了老家&#xff0c;想着收拾一下&…

体验 gpt4free

体验 gpt4free 什么是 gpt4free效果演示安装 ffmpeg启动 gpt4free访问 gpt4free gui其他 什么是 gpt4free GPT4Free 是一个由 xtekky 创建的基于 OpenAI GPT-4 和 GPT-3.5 的 API。它可以向用户提供类似于 OpenAI GPT-3 的功能&#xff0c;如文本生成、问答、翻译等。 GPT4Fre…

【电源专题】案例:拆一个早期用的万能充看看内部状况

说到万能充,可能存在80/90后的记忆里。以前手机都可以更换电池的,所有往往都是买两块,一块在手机内部使用,另一块在万能充充电。 万能充的外观也是大同小异的,从网上找了一些图片: 这东西现在日常生活已经都看不到了,关键因素之一应该是现在的手机电池都是不可拆…