【java小知识】空指针还在用if判断?Optional更好用。Optional常用方法 源码分析

Optional 可以很好的简化代码,并处理空指针的问题。空指针当然用 if 也是可以判断的,但是这样会显得代码臃肿不美观

在这里插入图片描述

Optional到底如何使用?

//先构造一个学生类
class Student {
    private String name;
    private String num;

    public Student() {
    }

    public Student(String name, String num) {
        this.name = name;
        this.num = num;
    }
//返回一个集合,如果name和num都为空 则返回一个空集合
    public List getStudent() {
        List stus = new ArrayList();
        stus.add(name);
        stus.add(num);
        if(name==null&&num==null){
            return null;
        }
        return stus;
    }
}

  1. 如果集合不为空
public static void main(String[] args) {
      Student student = new Student("张三", "123");
      //调用getStudent返回一个集合
      List student1 = student.getStudent();
      //通过stream流进行遍历输出
      student1.stream().forEach(stu -> System.out.println(stu));
  }

运行结果:
在这里插入图片描述

  1. 如果集合为空
  public static void main(String[] args) {
        //调用空构造
        Student student=new Student();
        //此时应该返回空集合
        List student1 = student.getStudent();
        student1.stream().forEach(stu -> System.out.println(stu));

    }

输出结果:
在这里插入图片描述
可以看到出现了空指针异常

  1. 下面通过Optional来解决这种异常
  public static void main(String[] args) {
        Student student=new Student();
        List student1 = student.getStudent();
        //使用Optional来解决
        Optional.ofNullable(student1).orElse(new ArrayList()).stream().forEach(stu-> System.out.println(stu));
   }

输出结果:在这里插入图片描述
可以看出没有报空指针异常,什么都没有输出是因为集合为空。上面代码中使用的Optional方法下面来讲解

Optional中的方法

1.of()
//进入of方法
public static <T> Optional<T> of(T value) {
        return new Optional<>(value);
    }
// 进入Optional
private Optional(T value) {
        this.value = Objects.requireNonNull(value);
    }
//进入requireNonNull
public static <T> T requireNonNull(T obj) {
        if (obj == null)
            throw new NullPointerException();
        return obj;
    }

通过层层进入,可以看出如果of()方法传入的为空值的话,会抛出空指针异常。如果不为空,则会返回传入的值。而且会将传入的参数赋值给Optional中的value成员变量

2.ofNullable()
//进入ofNullable.
    public static <T> Optional<T> ofNullable(T value) {
        return value == null ? empty() : of(value);
    }

可以看出如果传入的value为null。则会进入empty(),否则调用of()。of()方法就是上面看过的。

//进入empty
 public static<T> Optional<T> empty() {
        @SuppressWarnings("unchecked")
        Optional<T> t = (Optional<T>) EMPTY;
        return t;
    }
 private static final Optional<?> EMPTY = new Optional<>();
//进入Optional构造方法
   private Optional() {
        this.value = null;
    }
  private final T value;

可以看出EMPTY是一个Optional对象。通过Optional构造方法将value变为null。这个过程中并没有抛出空指针异常。此value为Optional类中的一个final修饰的成员变量

所以ofNullable在传入的value 为 NULL时,不会爆出空指针异常。

3.orElse()

public T orElse(T other) {
        return value != null ? value : other;
    }

orElse方法会对Optional中的value成员变量进行判断,如果为空返回传入的参数。如果不为空 则为Optional中的value成员变量。

4. get()
public T get() {
        if (value == null) {
            throw new NoSuchElementException("No value present");
        }
        return value;
    }

如果Optional中的value成员变量的值为NULL 抛出异常。

5.总结

ofNullable()经常与orElse()配套使用。
ofNullable()如果传入的参数为空会将Optional中的value成员变量赋值为NULL。
of()如果传入的参数不为空会将Optional中的value成员变量赋值为传入的 参数

ofNullable()、orElse()搭配

如果传入的参数值为空,则会使用orElse中传入的参数值。
如果传入的参数不为空,则会使用ofNullable中传入的参数值。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

圆○

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值