Java Optional


定义

  1. java.util.Optional
  2. 为解决空引用异常引入的,用于封装单值元素的容器(single-value container),即,基于Optional提供的一系列方法,操作封装在Optional容器中的,可能引起空引用的元素对象
import javax.swing.text.html.Option;
import java.util.Optional;
class Student{
    private int id;
    private String name;
    Student(int id,String name){
        this.id=id;
        this.name=name;
    }
    public int getId() {
        return id;
    }
    public String getName() {
        return name;
    }
}

1. 创建容器

empty() / of() / ofNullable()

public class Test {
    public static void main(String[] args) {
        Optional<Student> s = Optional.empty();  // 创建一个空的 Optional 实例
        Student d = new Student(2021224,"张三");
        Optional<Student> t = Optional.of(d);  //创建一个 Optional 实例,d不能为null
        Optional<Student> u = Optional.ofNullable(null); //创建一个 Optional 实例,d可以为null,返回一个空的实例
    }
}

2. 执行操作

基于容器是否为空,执行操作,无返回值

ifPresent() / ifPresentOrElse()

public class Test {
    public static void main(String[] args) {
        Optional<Student> s = Optional.empty();  // 创建一个空的 Optional 实例
        Student d = new Student(2021224,"张三");
        Optional<Student> t = Optional.of(d);  //创建一个 Optional 实例,d不能为null
        Optional<Student> u = Optional.ofNullable(null); //创建一个 Optional 实例,d可以为null,返回一个空的实例
        t.ifPresent(i -> System.out.println(i.getName())); //不为空时执行操作
        u.ifPresentOrElse(i -> System.out.println(i.getName()), () -> System.out.println("it is null")); //不为空时执行前一个操作,为空时执行后一个操作
    }
}

执行结果:

张三
it is null

Process finished with exit code 0

3. 中间操作

将操作结果,置于新Optional容器以执行后续操作,结果为空,也会返回相同类型的空容器

filter() / map() / or()

public class Test {
    public static void main(String[] args) {
        Optional<Student> s = Optional.empty();  // 创建一个空的 Optional 实例
        Student d = new Student(2021224,"张三");
        Student e = new Student(2021225,"李四");
        Optional<Student> t = Optional.of(d);  //创建一个 Optional 实例,d不能为null
        Optional<Student> u = Optional.ofNullable(null); //创建一个 Optional 实例,d可以为null,返回一个空的实例
        t.filter(i -> i.getName()=="张三")  //过滤
                .ifPresentOrElse(i -> System.out.println(i.getName()), () -> System.out.println("null"));
        u.filter(i -> i.getName()=="张三")  //过滤,空的 Optional 也可以执行,结果为空
                .ifPresentOrElse(i -> System.out.println(i.getName()), () -> System.out.println("null"));
        System.out.println(t.map(Student::getName).get());  //映射
        System.out.println("------");
        u.or(() -> Optional.ofNullable(e)).ifPresent(i -> System.out.println(i.getName()));  //为空时执行指令
    }
}

执行结果:

张三
null
张三
------
李四

Process finished with exit code 0

4. 获取操作

获取容器中对象

orElse() / orElseGet() / get()

public class Test {
    public static void main(String[] args) {
        Optional<Student> s = Optional.empty();  // 创建一个空的 Optional 实例
        Student d = new Student(2021224,"张三");
        Student e = new Student(2021225,"李四");
        Optional<Student> t = Optional.of(d);  //创建一个 Optional 实例,d不能为null
        Optional<Student> u = Optional.ofNullable(null); //创建一个 Optional 实例,d可以为null,返回一个空的实例
        System.out.println(t.orElse(e).getName());
        System.out.println(u.orElse(e).getName());  //为空时执行操作,获取 Student 对象
        System.out.println(t.orElseGet(() -> e).getName());
        System.out.println(u.orElseGet(() -> e).getName());  //为空时执行操作,获取 Student 对象
        System.out.println(t.get().getName()); //获取对象,为空时报错
    }
}

执行结果:

张三
李四
张三
李四
张三

Process finished with exit code 0

5. 判断方法

判断当前容器是否为空

isPresent() / isEmpty()

public class Test {
    public static void main(String[] args) {
        Optional<Student> s = Optional.empty();  // 创建一个空的 Optional 实例
        Student d = new Student(2021224,"张三");
        Optional<Student> t = Optional.of(d);  //创建一个 Optional 实例,d不能为null
        Optional<Student> u = Optional.ofNullable(null); //创建一个 Optional 实例,d可以为null,返回一个空的实例
        System.out.println(s.isPresent());  //非空为true
        System.out.println(s.isEmpty());  //空为true
    }
}

执行结果:

false
true

Process finished with exit code 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值