Optional类的主要功能是进行null 的相关处理,在以前进行程序开发的时候,如果为了防止程序之中出现的空指向异常,往往可以追加有null 的验证。
范例:传统的引用传递问题
package cn.mldn.demo;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
MessageUtil.useMessage(MessageUtil.getMessage());
}
}
class MessageUtil {
private MessageUtil() {}
public static IMessage getMessage() {
return null;
}
public static void useMessage(IMessage msg) {
if (msg != null) {
System.out.println(msg.getContent()); // 有可能因为出现null,而导致空指向
}
}
}
interface IMessage {
public String getContent();
}
class MessageImpl implements IMessage {
@Override
public String getContent() {
return "www.mldn.cn";
}
}
在引用接收的一方往往都是被动的进行判断,所以为了解决这种被动的处理操作,在Java类中提供有一个Optional 的类,这个类可以实现null 的处理操作,在这个类里面提供有如下的一些操作方法:
返回空数据:public static 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);
范例:修改程序,按照正规的结构完成
package cn.mldn.demo;
import java.util.Optional;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
IMessage temp = MessageUtil.getMessage().get(); // 获取数据
MessageUtil.useMessage(temp);
}
}
class MessageUtil {
private MessageUtil() {}
public static Optional<IMessage> getMessage() {
return Optional.of(new MessageImpl()); // 有对象
}
public static void useMessage(IMessage msg) {
if (msg != null) {
System.out.println(msg.getContent()); // 有可能因为出现null,而导致空指向
}
}
}
interface IMessage {
public String getContent();
}
class MessageImpl implements IMessage {
@Override
public String getContent() {
return "www.mldn.cn";
}
}
如果说现在数据保存的内容是null,则就会在保存处出现异常:
public static Optional<IMessage> getMessage() {
return Optional.of(null); // 有对象
}
Exception in thread "main" java.lang.NullPointerException
at java.base/java.util.Objects.requireNonNull(Objects.java:221)
at java.base/java.util.Optional.<init>(Optional.java:107)
at java.base/java.util.Optional.of(Optional.java:120)
at MLDNProject/cn.mldn.demo.MessageUtil.getMessage(JavaAPIDemo.java:14)
at MLDNProject/cn.mldn.demo.JavaAPIDemo.main(JavaAPIDemo.java:7)
由于Optional 类中允许保存有null 的内容,所以在数据获取的时候也可以进行null的处理。但是如果为null,则在使用get()获取数据的时候就会出现“Exception in thread “main” java.util.NoSuchElementException: No value present”的异常信息,所以此时可以更换为orElse()方法。
范例:处理null
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
IMessage temp = MessageUtil.getMessage().orElse(new MessageImpl()); // 获取数据
MessageUtil.useMessage(temp);
}
}
在所有引用数据类型的操作处理之中,null 是一个重要的技术问题,所以JDK1.8后提供的这个新的类对于null的处理很有帮助,同时也是在日后进行项目开发之中使用次数很多的一个程序类。