Optional类的主要功能是进行null的相关处理,在以前进行程序开发的时候,如果为了防止程序之中出现空指针异常,可以追加有null的验证。
public class Optional {
public static void main(String[] args) {
MessageUtil.useMessage(MessageUtil.getMessage());
}
}
interface IMessage {
public String getContent();
}
class MessageUtil {
public static IMessage getMessage() {
return new MessageImpl();
}
public static void useMessage(IMessage msg) {
if (msg != null) {
System.out.println(msg.getContent());//有可能出现null导致空指向
}
}
}
class MessageImpl implements IMessage {
@Override
public String getContent() {
return null;
}
}
在引用接收的一方往往都是被动的进行判断。为了解决这种被动的处理操作,在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 or Else(T other);
范例:修改程序,按照正规的结构完成。
public class OptionalTest {
public static void main(String[] args) {
IMessage temp = MessageUtil.getMessage().get();//获取数据
MessageUtil.useMessage(temp);
}
}
interface IMessage {
public String getContent();
}
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导致空指向
}
}
}
class MessageImpl implements IMessage {
@Override
public String getContent() {
return null;
}
}
如果现在数据保存的内容是null,则就会在保存处出现异常。直接明确的告诉你空的地方在哪,of不能为空!。
public static Optional<IMessage> getMessage() {
return Optional.of(null);//有对象
}
ofNullable()方法允许保存有null,但是get获取会报错,由于Optional类中允许保存有null的内容,所以在数据获取的时候也可以进行null的处理。但是如果为null,则在使用get()获取数据的时候就会出现 Exception in thread "main" java.util.NoSuchElementException: No value present
报错信息,所以此时可以更换为orElse()方法
public static Optional<IMessage> getMessage() {
return Optional.ofNullable(null);//有对象
}
在所有引用数据类型的操作处理之中,null是一个重要的技术问题。