Java 8 (5/6篇) - Optional 避免空指针

本文介绍了Java中Optional类如何避免NullPointerException,通过示例演示了of(), ofNullable(), empty()等方法的使用,以及如何通过isPresent(), get(), orElse()等操作处理可能存在的null值,提升代码健壮性。

为了解决当值为 null 的时候会报错 NullPointerException 导致程序崩溃退出,以及Debug定位到错误代码难的痛点。Optional 是一个容器来包装对象,它可能包含值也可能为空值。

方法说明

Optional.of ()

Optional.ofNullable ()

Optional.empty ()

创建Optional对象

包装对象不为null(否则空指针异常)

包装对象可为null

包装对象为null

isPresent ()包装对象值是否存在(不要使用if当作传统null判断使用,违背设计初衷)
get ()获取包装对象的值(如果为null,报错NoSuchElementException)
orElse (T other)获取包装对象的值,有值就返回,为null返回传入的默认值(类型和包装对象的类型一样)
orElseGet (Supplier other)获取包装对象的值,有值就返回,为null返回函数的值
orElseThrow (Supplier exceptionSupplier)获取包装对象的值,有值就返回,为null返回一个Throwable对象
ifPresent (Consumer consumer)如果包装对象的值不为null,对包装对象进行消费
filter (Predicate predicate)符合判断就返回Optional本身,否则返回包装对象值为null的Optional
map (Function mapper)对包装对象进行函数运算
flatMap ()将一个二维的Optional对象映射成一个一维的对象
main() {
    Person person = new Person("张三", 18);
    //创建对象
    Optional<Person> optionalPerson = Optional.of(person);  //包装对象不为null的Optional实例(传入null值报错NullPointerException)
    Optional<Person> optionalNullable = Optional.ofNullable(person);    //包装对象可为null
    Optional<Object> optionalEmpty = Optional.empty();  //包装对象值为null
    //判断包装对象值是否存在 isPresent()
    boolean isPersonExist = optionalPerson.isPresent();
    //获取包装对象值(需先判断存在) get()
    Person person1 = optionalPerson.get();  //如果值为null,报错NoSuchElementException
    //获取包装对象值,有值则返回,否则返回默认值 orElse()
    Person personElse = optionalPerson.orElse(new Person("李四", 22));
}

//传统null判断
public String getName(Person person) {
    if (person == null) {
        return "Unknown";
    }
    return person.getName();
}

//相比传统null判断,Optional写法更简便
public String getName2(Person person) {
    return Optional.ofNullable(person).map(p -> p.getName()).orElse("Unknown");
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值