Optional的使用详解

首先准备一个pojo类

public class Student {
    private String name;
    private Integer age;
}

创建Optional

        // 构建一个value为null的optional对象
        Optional<Student> emptyOpt = Optional.empty();
        // 构建一个value不为null的optional对象
        Optional<Student> opt = Optional.of(new Student("hh",18));
        // 构建一个value为null的optional对象
        Optional<String>  opt1 = Optional.ofNullable(null);
       // Optional<Student> emptyOpt1 = Optional.of(null); 会抛异常

注意Optional.of创建对象时传入的参数不能为null。如果传入参数为null,会抛出异常

Exception in thread "main" java.lang.NullPointerException
	at java.util.Objects.requireNonNull(Objects.java:203)
	at java.util.Optional.<init>(Optional.java:96)
	at java.util.Optional.of(Optional.java:108)
	at com.wupx.dto.Student.main(Student.java:20)

Process finished with exit code 1

isPresent和get方法

        //isPresent方法用来检查Optional实例中是否包含值存在返回true,否则返回false。
        if(opt.isPresent()){
            //在Optional实例内调用get()返回已存在的值.存在返回true,否则返回false。
            System.out.println(opt.get());
        }

输出为

Student(name=hh, age=18)

ifPresent
如果存在值,则使用该值调用指定的消费者,否则不执行任何操作。

 opt.ifPresent( student-> System.out.println(student.getName()));

输出

hh

返回默认值
orElse
如果有值则将其返回,否则返回指定的其它值。
orElseGet
orElseGet方法可以接受Supplier接口的实现用来生成默认值。
orElseThrow
如果存在返回包含的值,否则抛出提供的异常

        System.out.println(opt.orElse(new Student("默认值",18))); //Student(name=hh, age=18)
        System.out.println(emptyOpt.orElse(new Student("默认值",18)));//Student(name=默认值, age=18)
        emptyOpt.orElseGet( ()-> new Student("默认值",18) );//Student(name=默认值, age=18)
        empty.orElseThrow(ValueAbsentException::new);

map
如果有值,则对其执行调用mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional。此方法支持对optional值进行后处理,而无需显式检查返回状态
filter
如果存在值,并且值与给定谓词匹配,则返回描述该值的Optional,否则返回空Optional。

opt.filter(s -> s.getAge()>10).map(Student::getName);

flatmap示例

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值