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

