Java原生解决null问题的包装类Optional

Optional类

Optional是在jdk1.8才有的
Optional 类的主要功能是进行 null 的相关处理,在以前进行程序开发时,为了防止程序之中出现空指向异常,往往可以追加有 null 的验证。

传统的引用传递

public class OptionalTest {
    public static void main(String[] args) {
        MessageUtils.useMessage(MessageUtils.getMessage());
    }
}

class MessageUtils {
    private MessageUtils() {
    }
    public static Imessage getMessage () {
        return null;
    }

    public static void useMessage(Imessage imessage) {
        if (imessage != null)
            System.out.println(imessage.getContent());// 有可能出现null,导致空指针
    }
}

interface Imessage {
    String getContent();
}

class MyMessage implements Imessage {
    @Override
    public String getContent() {
        return "~~~虫儿飞~~~";
    }
}

总结:

在引用接受的一方,我们往往都是被动的一方进行判断。

  • 返回空数据: public staticT> Optional empty();

  • 获取数据:public T get();

  • 保存数据,但是不允许出现 null: public static Optional of(T value).

    • 如果在保存数据的时候存在有 null,则会抛出 NullPointerException 异常;
  • 保存数据,允许为空:public static Optional ofNullable(T value);

  • 空的时候返回其他数据:public T orElse(T other)

使用Optional修改程序

按照正规程序完成

public class OptionalTest {
    public static void main(String[] args) {
        Imessage temp = MessageUtils.getMessage().get(); // 获取数据
        MessageUtils.useMessage(temp);
    }
}

class MessageUtils {
    private MessageUtils() {
    }

    public static Optional<Imessage> getMessage () {
        return Optional.of(new MyMessage());
    }

    public static void useMessage(Imessage imessage) {
        if (imessage != null)
            System.out.println(imessage.getContent());
    }
}

interface Imessage {
    String getContent();
}

class MyMessage implements Imessage {


    @Override
    public String getContent() {
        return "~~~虫儿飞~~~";
    }
}

如果程序传入空时

    public static Optional<Imessage> getMessage () {
        return Optional.of(null);
    }

此时Optional.of(null);这句话会报空指针异常

由于Optional类中允许保存有null的内容,所以在获取数据的时候也可以进行null的处理。

    public static Optional<Imessage> getMessage () {
        return Optional.ofNullable(null);// 使用此方法可以传null
    }

但是如果为空,这时使用get()获取数据的时候就会出现Exception in thread "main" java.util.NoSuchElementException: No value present这个异常信息

所以说获取数据的时候该使用orElse

public class OptionalTest {
    public static void main(String[] args) {
        Imessage temp = MessageUtils.getMessage().orElse(new MyMessage()); // 获取数据
        MessageUtils.useMessage(temp);
    }
}

如果传输的接口不为空,就不会用到orElse中的参数

Java原生解决null问题的包装类Optional_第1张图片

总结:

在所有引用数据类型的操作处理之中,null 是一个重要的技术问题,JDK 1.8 后提供的新的类,对于 Null 的处理很有帮助,同时也是在日后进行项目开发之中使用次数很多的一个程序类。

PS:以上内容总结于阿里云培训

你可能感兴趣的:(Java常用方法,Optional,Java原生null解决方案,java,开发语言,架构,后端,学习)