Java8新特性 之Optional

Optional简介

用于简化Java中对空值的判断处理,以防止出现各种空指针异常(NullPointerException)。
Optional实际上是对一个变量进行封装,它就是一个包装类,包含有一个属性value,实际上就是这个变量的值。
在这里插入图片描述
Optional提供的方法:

方法描述
of把指定的值封装为Optional对象,如果指定的值为null,则抛出NullPointerException
empty创建一个空的Optional对象
ofNullable把指定的值封装为Optional对象,如果指定的值为null,则创建一个空的Optional对象
get如果创建的Optional中有值存在,则返回此值,否则抛出NoSuchElementException
orElse如果创建的Optional中有值存在,则返回此值,否则返回一个默认值
orElseGet如果创建的Optional中有值存在,则返回此值,否则返回一个由Supplier接口生成的值
orElseThrow如果创建的Optional中有值存在,则返回此值,否则抛出一个由指定的Supplier接口生成的异常
filter如果创建的Optional中的值满足filter中的条件,则返回包含该值的Optional对象,否则返回一个空的Optional对象
map如果创建的Optional中的值存在,对该值执行提供的Function函数调用
flagMap如果创建的Optional中的值存在,就对该值执行提供的Function函数调用,返回一个Optional类型的值,否则就返回一个空的Optional对象
isPresent如果创建的Optional中的值存在,返回true,否则返回false
ifPresent如果创建的Optional中的值存在,则执行该方法的调用,否则什么也不做

of、ofNullable、empty(封装Optional对象)

of
传入的值为null,则抛出NullPointerException。

//创建一个值为张三的String类型的Optional
Optional<String> ofOptional = Optional.of("张三");
//如果我们用of方法创建Optional对象时,所传入的值为null,则抛出NullPointerException
Optional<String> nullOptional = Optional.of(null);

ofNullable
传入的值为null,默认返回空的Optinal,不会报错。

//为指定的值创建Optional对象,如果传入的值为null,默认返回空的Optinal,不会报错
Optional<String> nullOptional = Optional.ofNullable(null);
Optional<String> nullOptional = Optional.ofNullable("lisi");

empty

//创建一个空的String类型的Optional对象
Optional<String> emptyOptional = Optional.empty();

filter(过滤值)

如果创建的Optional中的值满足filter中的条件,则返回包含该值的Optional对象,否则返回一个空的Optional对象。

Optional<String> stringOptional = Optional.of("zhangsan");
System.out.println(stringOptional.filter(e -> e.length() > 5).orElse("王五"));
stringOptional = Optional.empty();
System.out.println(stringOptional.filter(e -> e.length() > 5).orElse("lisi"));

运行结果:
zhangsan
lisi

注意Optional中的filter方法和Stream中的filter方法是有点不一样的,Stream中的filter方法是对一堆元素进行过滤,而Optional中的filter方法只是对一个元素进行过滤,可以把Optional看成是最多只包含一个元素的Stream。

map、flatMap(转换值)

功能:如果创建的Optional中的值存在,调用Function函数对值进行处理,并返回处理后的Optional,否则返回 Optional.empty() 。
map、flatMap方法执行传入的lambda表达式参数对Optional实例的值进行修改,修改后的返回值仍然是一个Optional对象;
区别:map会自动将计算结果封装为Optional对象,而flatMap需要自己进行封装。

Person person = new Person("tom", 18);

Optional<Person> o = Optional.ofNullable(person).map(p -> {
    p.setAge(20);
    return p;
});

Optional<Person> o = Optional.ofNullable(person).flatMap(p -> {
    p.setAge(30);
    return Optional.ofNullable(p);
});

get、orElse、orElseGet(获取值)

get
如果创建的Optional对象中有值存在则返回此值,如果没有值存在,则会抛出 NoSuchElementException异常。

Optional<String> stringOptional = Optional.of("张三");
System.out.println(stringOptional.get());

orElse
如果创建的Optional中有值存在,则返回此值,否则返回一个默认值。

Optional<String> stringOptional = Optional.of("张三");
System.out.println(stringOptional.orElse("zhangsan"));

Optional<String> emptyOptional = Optional.empty();
System.out.println(emptyOptional.orElse("李四"));

orElseGet
如果创建的Optional中有值存在,则返回此值,否则返回一个由Supplier接口的实现类生成的值。

Optional<String> emptyOptional = Optional.empty();
System.out.println(emptyOptional.orElseGet(() -> {
    String str = "name";
    return str;
}));

ifPresent、isPresent(判断值)

ifPresent
参数是一个Consumer的实现类,Consumer类包含一个抽象方法,该抽象方法对传入的值进行处理,只处理没有返回值。

Optional<String> stringOptional = Optional.of("zhangsan");
stringOptional.ifPresent(e-> System.out.println("我被处理了。。。"+e));

运行结果:
我被处理了。。。zhangsan

isPresent
如果创建的Optional中的值存在,返回true,否则返回false。

处理NULL值

Lambda配合Optional<T>可以使Java对于null的处理变的异常优雅。
在这里插入图片描述
只有当Optional<T>结合Lambda一起使用的时候,才能发挥出其真正的威力!
在这里插入图片描述

参考:
JDK1.8新特性值Optional
理解、学习与使用 JAVA 中的 OPTIONAL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值