Java-Optional

java.util.Optional

为解决空引用异常引入的,用于封装单值元素的容器(single-value container),一个容器内最多只能装一个值,该值可以为空。
即,基于Optional提供的一系列方法,操作封装在Optional容器中的,可能引起空引用的元素对象

创建容器
ofNullable() / of()
执行操作,基于容器是否为空,执行操作,无返回值
ifPresent() / ifPresentOrElse()
中间操作,将操作结果,置于新Optional容器以执行后续操作,结果为空,也会返回相同类型的空容器
filter() / map() / or()(需手动创建容器注入)
获取操作,获取容器中对象
orElse() / orElseGet() / get()
判断方法,判断当前容器是否为空
isEmpty() / isPresent()
Creating Optional Objects
Optional<T> Optional.of(T value),基于必不为空对象,创建optional容器,注入为空元素将抛出NullPointerException异常
Optional<T> Optional.ofNullable(T value),基于可能为空的对象,创建optional容器
	private static void create(){
        USB u1 = new USB("键盘");
        USB u2 = new USB("鼠标");
        USB u3 = null;
        Optional<USB> usb1 = Optional.ofNullable(u1); // 相当于:
        // Optional<USB> usb1 = Optional.of(u1);
        Optional<USB> usb2 = Optional.ofNullable(u2);
        Optional<USB> usb3 = Optional.ofNullable(u3); // 不可以用
        // Optional<USB> usb3 = Optional.of(u3); 因为现在的u3是空指针。
    }

ifPresent()

当容器不空执行指定函数,为空或则忽略执行。

private static void create(){
        USB u1 = new USB("键盘");
        USB u2 = new USB("鼠标");
        USB u3 = null;
        Optional<USB> usb1 = Optional.ofNullable(u1);
        Optional<USB> usb2 = Optional.ofNullable(u2);
        Optional<USB> usb3 = Optional.ofNullable(u3);
        usb1.ifPresent(usb -> {System.out.println(usb.getName());});
        // 当Optional容器不空的时候执行的函数;
    }

Void ifPresentOrElse(, )

2个函数的参数,当容器不为空时执行第一个函数;为空执行第二个函数

Java9才有。
private static void create(){
        USB u1 = new USB("键盘");
        USB u2 = new USB("鼠标");
        USB u3 = null;
        Optional<USB> usb1 = Optional.ofNullable(u1);
        Optional<USB> usb2 = Optional.ofNullable(u2);
        Optional<USB> usb3 = Optional.ofNullable(u3);
        usb1.ifPresentOrElse(usb -> {System.out.println(usb.getName());}, () -> System.out.println("空"));
        // 当Optional容器不空的时候执行第一个函数, 否则之心发第二个函数。
    }

Optional filter​()

过滤容器中元素。容器为空,返回空容器;容器不为空,执行过滤;符合条件,将对象置于新容器,不符合条件,返回空容器
即,无论是否匹配,均返回一个容器,用于后续操作

public static void main(String[] args){
        USB u1 = new USB("键盘");
        USB u2 = new USB("鼠标");
        USB u3 = null;
        Optional<USB> usb1 = Optional.ofNullable(u1);
        Optional<USB> usb2 = Optional.ofNullable(u2);
        Optional<USB> usb3 = Optional.ofNullable(u3);
        usb1.filter(usb -> "键盘".equals(usb.getName()))
                .ifPresent(usb -> System.out.println(usb.getName()));
    }

Optional map()

基于容器中对象,映射。容器为空,返回相同类型的空容器;容器不为空,执行映射函数,将映射结果封装在新容器中
即,无论是否匹配,均返回一个容器,用于后续操作

public static void main(String[] args){
        USB u1 = new USB("键盘");
        USB u2 = new USB("鼠标");
        USB u3 = null;
        Optional<USB> usb1 = Optional.ofNullable(u1);
        Optional<USB> usb2 = Optional.ofNullable(u2);
        Optional<USB> usb3 = Optional.ofNullable(u3);
        usb1.map(USB::getName)
                .ifPresent(System.out::println);
    }

Optional or​()

容器为空,执行函数,且必须返回一个,相同类型的容器,可以为空容器

public static void main(String[] args){
    USB u1 = new USB("键盘");
    USB u2 = new USB("鼠标");
    USB u3 = null;
    Optional<USB> usb1 = Optional.ofNullable(u1);
    Optional<USB> usb2 = Optional.ofNullable(u2);
    Optional<USB> usb3 = Optional.ofNullable(u3);
    usb1.or(() -> {return Optional.ofNullable(new USB("xin"));})
            .ifPresent (u -> {System.out.println(u.getName());});
}

T get()

public static void main(String[] args){
    USB u1 = new USB("键盘");
    USB u2 = new USB("鼠标");
    USB u3 = null;
    Optional<USB> usb1 = Optional.ofNullable(u1);
    Optional<USB> usb2 = Optional.ofNullable(u2);
    Optional<USB> usb3 = Optional.ofNullable(u3);
    System.out.println(usb1.get().getName());
}

其他的方法

Default Value With,T orElse()/orElseGet()
返回容器中对象,容器为空,则创建默认对象替代
T orElseGet(supplier),容器为空时,执行函数,且必须返回容器中相同类型对象;容器不为空不执行
T orElse(T other),无论是否为空,均创建默认对象
返回的不再是Optional容器,而是容器中最终的元素对象
Exceptions with orElseThrow(),当为空时,抛出指定异常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值