Java Optional示例

时间:2020-02-23 14:37:13  来源:igfitidea点击:

Java8引入了可选类,用于根据值是否存在来操作数据。不使用这个类也可以有相同的功能,但是最终会得到更混乱的代码。换句话说,我们将有更少的空检查和没有NullPointerException。

让我举个例子来说明为什么不使用Optional可能会导致问题。

不使用Optional

public class NonOptionalImplementation {

  public static void main(String[] args) {

     Animal dog = new Animal(null, 5);
     String dogModified = dog.getName().toLowerCase();
     System.out.println(dogModified);
  }

 }

 class Animal {

  private String name;
  private int age;

  Animal(String n, int a) {
     this.name = n;
     this.age = a;
  }

  public String getName() {
     return this.name;
  }

  public int getAge() {
     return this.age;
  }

 }

你会错其中?当我们把对象的名称设置为空时,抛出一个空值。

输出

Exception in thread "main" java.lang.NullPointerException
      at OptionalImplementation.main(OptionalImplementation.java:6)

使用Optional解决此问题

import java.util.Optional;
import java.util.*;

public class OptionalImplementation {

  public static void main(String[] args) {

     Animal dog = new Animal(null, 5);

     System.out.println(Optional.ofNullable(dog.getName()).orElse("Name not provided"));
  }

 }

 class Animal {

  private String name;
  private int age;

  Animal(String n, int a) {
     this.name = n;
     this.age = a;
  }

  public String getName() {
     return name;
  }

  public int getAge() {
     return this.age;
  }

 }

输出

Name not provided

上述实施的简要说明

我们正在创建一个非常简单的名为Animal的类,我们有两个getter方法和一个构造函数

在我们的main方法中,我们创建了动物类的一个实例,但是我们也将第一个参数(恰好是名称)赋值为null

可选。不带检查传递的字符串是否为null

之后,我们将尝试打印值

我们有一个.orElse()方法调用,这基本上意味着:如果调用此方法的字符串为null,那么我将打印任何作为参数的值

如果它不为空,那么我将打印原始字符串

换句话说,如果字符串为null,它将打印一个默认值

很酷,不是吗?当我们检查空值时,看看我们的代码有多优雅。也很安全!

为了进行比较,让我们尝试在不使用可选类的情况下获得相同的结果。

public class OptionalImplementation {

  public static void main(String[] args) {

     Animal dog = new Animal(null, 5);

     if (dog.getName() == null) {
         System.out.println("Name not provided");
     } 
     else {
         System.out.println(dog.getName().toLowerCase());
     }

  }

 }

 class Animal {

  private String name;
  private int age;

  Animal(String n, int a) {
     this.name = n;
     this.age = a;
  }

  public String getName() {
     return this.name;
  }

  public int getAge() {
     return this.age;
  }

 }

输出

Name not provided

它起作用了。。但它干净吗?我不这么认为!

也可以使用isPresent()方法检查对象中是否有值:

import java.util.Optional;

public class OptionalImplementation {

  public static void main(String[] args) {
     Optional<Object> n = Optional.empty(); //creating an empty string

     System.out.println(n.isPresent());
     System.out.println(n);
  }
 }

输出

false
Optional.empty

不是很难吧?它甚至不是很容易理解,但它也大大简化了代码,并且非常容易阅读和维护。如果我们想探索Optional提供的所有方法,请查看Oracle的官方文档。