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的官方文档。