教你怎么使用Optional处理null

一、聊聊NullPointerException

相比做Java开发的,见到NullPointerException肯定不陌生吧,可以说见到它深恶痛绝。在开发时认为不会出现NullPointerException异常,最终到了生产环境,就给你来点意外惊喜。但是在开发时处理对象为空的通常都是用if(null != xxx),或者使用一些工具类,比如:if(ObjectUtils.isEmpty(xxx)),可以看出这种处理会让我们的代码变得很臃肿,遇到一个对象时可能都要这样来一下。

使用Optional类就可以避免在程序中使用一堆的if来处理空了。下表列出Optional类中的方法:

方法名 描述
empty 返回一个空的Optional实例
of 将指定值用Optional封装后返回,如果值为null,则抛出NullPointerException异常
ofNullable 将指定值用Optional封装后返回,如果值为null,则返回空的Optional对象
get 如果值存在,则返回该值,否则抛出NullPointerException异常
isPresent 检查值是否存在,存在返回true,否则返回false
ifPresent 如果值存在,就执行使用该值的方法调用,否则什么都不做
filter 如果值存在并且满足提供的谓词,就返回包含该值的Optional对象,否则返回空的Optional对象
map 如果值存在,就对该值执行提供的mapping函数调用
flatMap 如果值存在,就对该值执行提供的mapping函数调用,返回一个Optional类型的值,否则就返回一个空的Optional对象
orElse 如果值存在就将其返回,否则返回指定的的值
orElseGet 如果值存在就将其返回,否则返回由指定的Supplier接口生成的值
orElseThrow 如果值存在就将其返回,否则抛出由指定的Supplier接口生成的异常

下面就一一来详细使用上面列出的方法。

二、使用Optional类

2.1 empty

Optional<User> user = Optional.empty();

创建一个空的Optional对象

2.2 of

User user = null;
Optional<User> optional = Optional.of(user);

user为空,直接报NullPointerException异常,因此该方法一般很少用。

2.3 ofNullable

User user = null;
Optional<User> optional = Optional.ofNullable(user);

user为空,则返回空的Optional对象

2.4 get

User user = null;
Optional<User> optional = Optional.ofNullable(user);
optional.get();

Optional中获取值,如果值不存在则抛出如下异常:java.util.NoSuchElementException: No value present

2.5 isPresent

User user = null;
Optional<User> optional = Optional.ofNullable(user);
optional.isPresent();

以上例子返回false,如果user不为空,则返回true

2.6 ifPresent

User user = null;
Optional<User> optional = Optional.ofNullable(user);
optional.ifPresent(us->{
	//user不为空,执行
});

2.7 filter

User user = new User();
user.setName("小A");
boolean result = Optional.ofNullable(user).filter(us -> "小A".equals(us.getName())).isPresent();

如果用户名为小A,则返回true,否则返回false

2.8 map

User user = new User();
user.setName("小A");
String name = Optional.ofNullable(user).map(User::getName).get();

如果user不为空,则抽取name属性,使用get()获取。这里如果name为空,则会报异常,因此通常都是指定默认值或使用自定义异常抛出。

String name = Optional.ofNullable(user).map(User::getName).orElse("");

String name = Optional.ofNullable(user)
                .map(User::getName)
                .orElseThrow(()->new RuntimeException("用户名不能为空"));

2.9 flatMap

该方法一般用于从类中获取其他类的中某个属性,比如一个班级里面有学生,学生里面有地址,现在需要获取这个班级下的某个学生的地址,按之前的写法:

Address address = new Address();
address.setAddr("天河区");

Student student = new Student();
student.setName("小A");
student.setAddress(address);

Grade grade = new Grade();
grade.setName("三年级2班");
grade.setStudent(student);

if(!ObjectUtils.isEmpty(grade)){
    Student student1 = grade.getStudent();
    if(!ObjectUtils.isEmpty(student1)){
        Address address1 = student1.getAddress();
        if(!ObjectUtils.isEmpty(address1)){
            System.out.println(address1.getAddr());
        }
    }
}

为了程序不出问题,就会写一大堆的if来判断,下面用flatMap来看下怎么实现:

Optional.ofNullable(grade)
                .flatMap(g->Optional.ofNullable(g.getStudent()))
                .flatMap(s->Optional.ofNullable(s.getAddress()))
                .map(Address::getAddr)
                .orElse("")

Optional.ofNullable(grade)
        .map(Grade::getStudent)
        .map(Student::getAddress)
        .map(Address::getAddr)
        .orElse("")

2.10 orElse

Optional.ofNullable(grade).orElse(new Grade());

2.11 orElseGet

Optional.ofNullable(grade).orElseGet(()->new Grade());

2.12 orElseThrow

Optional.ofNullable(grade).orElseThrow(()->new RuntimeException("班级不能为空"));

以上Optional类的全部方法的使用都列出来了。

到此这篇关于教你怎么使用Optional处理null的文章就介绍到这了,更多相关Optional处理null内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 为什么mysql字段要使用NOT NULL

    最近刚入职新公司,发现数据库设计有点小问题,数据库字段很多没有NOT NULL,对于强迫症晚期患者来说,简直难以忍受,因此有了这篇文章. 基于目前大部分的开发现状来说,我们都会把字段全部设置成NOT NULL并且给默认值的形式. 通常,对于默认值一般这样设置: 整形,我们一般使用0作为默认值. 字符串,默认空字符串 时间,可以默认1970-01-01 08:00:01,或者默认0000-00-00 00:00:00,但是连接参数要添加zeroDateTimeBehavior=convertToN

  • C++中NULL与nullptr的区别对比

    前言 在编写C程序的时候只看到过NULL,而在C++的编程中,我们可以看到NULL和nullptr两种关键字,其实nullptr是C++11版本中新加入的,它的出现是为了解决NULL表示空指针在C++中具有二义性的问题,为了弄明白这个问题,我查找了一些资料,总结如下. 一.C程序中的NULL 在C语言中,NULL通常被定义为:#define NULL ((void *)0) 所以说NULL实际上是一个空指针,如果在C语言中写入以下代码,编译是没有问题的,因为在C语言中把空指针赋给int和char

  • 还在用if(obj!=null)做非空判断,带你快速上手Optional

    1.前言 相信不少小伙伴已经被java的NPE(Null Pointer Exception)所谓的空指针异常搞的头昏脑涨, 有大佬说过"防止 NPE,是程序员的基本修养."但是修养归修养,也是我们程序员最头疼的问题之一,那么我们今天就要尽可能的利用Java8的新特性 Optional来尽量简化代码同时高效处理NPE(Null Pointer Exception 空指针异常) 2.认识Optional并使用 简单来说,Opitonal类就是Java提供的为了解决大家平时判断对象是否为空

  • 在Java中避免NullPointerException的解决方案

    我object != null要避免很多NullPointerException. 有什么替代方法: if (someobject != null) { someobject.doCalc(); } 解决方案: 在我看来,这似乎是一个相当普遍的问题,初级和中级开发人员往往会在某个时候遇到这些问题:他们要么不知道,要么不信任他们所参与的合同,并且防御性地检查了null.另外,在编写自己的代码时,他们倾向于依靠返回空值来表示某些内容,因此要求调用者检查空值. 换句话说,在两种情况下会出现空检查: 如

  • Oracle ORA-22908(NULL表值的参考)异常分析与解决方法

    场景如下: --创建类型(type)create or replace type list_obj is table of number;--创建表结构create table test( name varchar2(30) primary key check(regexp_like(name,'^([a-z]|[0-9]|_)+$')), id number not null, version_list list_obj) nested table version_list store as

  • MySQL中关于null值的一个小问题

    今天在测试null值的时候,发现了一个小问题,记录在这里,不知道大家以前遇到过没. 事情发展是这样的,在过滤一个表中的数值的时候,需要把age=2的列给剔除掉,然后查看剩余的列信息,这个操作看起来比较简单,我用一个表模拟一下过程: CREATE TABLE `test` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `age` int(11) DEFAULT NULL,   `score` varchar(20) NOT NULL DEFAULT '',

  • 聊聊python dropna()和notnull()的用法区别

    定义一个DataFrame data = {'a':[1,2,3,NaN],'b':['l','k','j','k'],'c':['12r','45h','45u','456u']} frame1 = DataFrame(data) print(frame1) print('\n') print(frame1.dropna()) print('\n') print(frame1[frame1.notnull()]) 输出: 当未精确定位到某一列,但该列中存在空值时,dropna()会将空值所在行

  • 详解Java中NullPointerException异常的原因详解以及解决方法

    NullPointerException是当您尝试使用指向内存中空位置的引用(null)时发生的异常,就好像它引用了一个对象一样. 当我们声明引用变量(即对象)时,实际上是在创建指向对象的指针.考虑以下代码,您可以在其中声明基本类型的整型变量x: int x; x = 10; 在此示例中,变量x是一个整型变量,Java将为您初始化为0.当您在第二行中将其分配给10时,值10将被写入x指向的内存中. 但是,当您尝试声明引用类型时会发生不同的事情.请使用以下代码: Integer num; num

  • java.lang.NullPointerException 如何处理空指针异常的实现

    当应用程序试图null在需要对象的情况下使用时抛出.这些包括: 调用null对象的实例方法. 访问或修改null对象的字段. 把长度null当作一个数组. 像访问或修改null阵列一样访问或修改插槽. 投掷null就好像它是一个Throwable 价值. 应用程序应该抛出此类的实例来指示null对象的其他非法使用. NullPointerException对象可以由虚拟机构造,就像抑制被禁用和/或堆栈跟踪不可写一样. 为什么我们需要空值? 如前所述,nullJava是一种特殊的值. 它在编码某些

  • 详解mysql三值逻辑与NULL

    什么是NULL NULL 用于表示缺失的值或遗漏的未知数据,不是某种具体类型的值.数据表中的 NULL 值表示该值所处的字段为空,值为 NULL 的字段没有值,尤其要明白的是:NULL 值与 0 或者空字符串是不同的. 两种 NULL 这种说法大家可能会觉得很奇怪,因为 SQL 里只存在一种 NULL .然而在讨论 NULL 时,我们一般都会将它分成两种类型来思考:"未知"(unknown)和"不适用"(not applicable,inapp licable).

随机推荐