Optional类
Optional
是在jdk1.8才有的
Optional
类的主要功能是进行 null 的相关处理,在以前进行程序开发时,为了防止程序之中出现空指向异常,往往可以追加有 null 的验证。
传统的引用传递
public class OptionalTest {
public static void main(String[] args) {
MessageUtils.useMessage(MessageUtils.getMessage());
}
}
class MessageUtils {
private MessageUtils() {
}
public static Imessage getMessage () {
return null;
}
public static void useMessage(Imessage imessage) {
if (imessage != null)
System.out.println(imessage.getContent());// 有可能出现null,导致空指针
}
}
interface Imessage {
String getContent();
}
class MyMessage implements Imessage {
@Override
public String getContent() {
return "~~~虫儿飞~~~";
}
}
总结:
在引用接受的一方,我们往往都是被动的一方进行判断。
-
返回空数据:
public staticT> Optional empty();
-
获取数据:
public T get();
-
保存数据,但是不允许出现 null:
public static Optional of(T value).
- 如果在保存数据的时候存在有 null,则会抛出 NullPointerException 异常;
-
保存数据,允许为空:
public static <T> Optional<T> ofNullable(T value);
-
空的时候返回其他数据:
public T orElse(T other)
使用Optional修改程序
按照正规程序完成
public class OptionalTest {
public static void main(String[] args) {
Imessage temp = MessageUtils.getMessage().get(); // 获取数据
MessageUtils.useMessage(temp);
}
}
class MessageUtils {
private MessageUtils() {
}
public static Optional<Imessage> getMessage () {
return Optional.of(new MyMessage());
}
public static void useMessage(Imessage imessage) {
if (imessage != null)
System.out.println(imessage.getContent());
}
}
interface Imessage {
String getContent();
}
class MyMessage implements Imessage {
@Override
public String getContent() {
return "~~~虫儿飞~~~";
}
}
如果程序传入空时
public static Optional<Imessage> getMessage () {
return Optional.of(null);
}
此时Optional.of(null);
这句话会报空指针异常
由于Optional类中允许保存有null的内容,所以在获取数据的时候也可以进行null的处理。
public static Optional<Imessage> getMessage () {
return Optional.ofNullable(null);// 使用此方法可以传null
}
但是如果为空,这时使用get()获取数据的时候就会出现Exception in thread "main" java.util.NoSuchElementException: No value present
这个异常信息
所以说获取数据的时候该使用orElse
public class OptionalTest {
public static void main(String[] args) {
Imessage temp = MessageUtils.getMessage().orElse(new MyMessage()); // 获取数据
MessageUtils.useMessage(temp);
}
}
如果传输的接口不为空,就不会用到orElse
中的参数
总结:
在所有引用数据类型的操作处理之中,null 是一个重要的技术问题,JDK 1.8 后提供的新的类,对于 Null 的处理很有帮助,同时也是在日后进行项目开发之中使用次数很多的一个程序类。
PS:以上内容总结于阿里云培训