文章目录
前言
据说Optional是用来解决空指针异常的
个人觉得应该是提醒编程人员处理空指针 , 以流行的代码链样式
空指针异常不是bug , 在将机器码面向对象的过程中 , 大神们努力地使正方形看起来像一个优雅的圆
最简示例
代码:
public static void main(String...arguments) {
System.out.println(Optional.ofNullable("世界你好").orElse("值为空"));
System.out.println(Optional.ofNullable(null).orElse("值为空"));
}
结果:
Optional是一个对象的容器, 该容器的功能之一 就是指定当对像为null时该干什么, 从而减少看到NullPointerException
既然是代码链, 就有头有尾
头 : 3种方法
Optional.ofNullable(T t)
参数 t 可null,可不null
@SuppressWarnings("unchecked")
public static <T> Optional<T> ofNullable(T value) {
return value == null ? (Optional<T>) EMPTY
: new Optional<>(value);
}
可以看出 , ofNullable 遇非null就of , 遇null就empty
Optional.of(T t)
参数 t null直接抛异常
public static <T> Optional<T> of(T value) {
return new Optional<>(Objects.requireNonNull(value));
}
Optional.empty()
无参 返回: final的 static的 保存null的 Optional (EMPTY)
private static final Optional<?> EMPTY = new Optional<>(null);
public static<T> Optional<T> empty() {
@SuppressWarnings("unchecked")
Optional<T> t = (Optional<T>) EMPTY;
return t;
}
尾 : 4种方法
T orElse(T other)
遇到null则返回传入的参数 other
public T orElse(T other) {
return value != null ? value : other;
}
T orElseGet(Supplier<? extends T> supplier)
遇null时的替代可实现Supplier做处理, 实现, 匿名内部类, lambda 皆可
orElseGet 源码
public T orElseGet(Supplier<? extends T> supplier) {
return value != null ? value : supplier.get();
}
orElseGet 用法示例
public class OptionalTest1 {
public static void main(String...arguments) {
System.out.println(
Optional.ofNullable(null).orElseGet(()->OptionalTest1.控制台输出并返回世界你好())
);
}
public static String 控制台输出并返回世界你好() {
System.out.println("控制台输出世界你好"); return "世界你好"; }
}
T orElseThrow()
null则抛异常
orElseThrow() 源码
public T orElseThrow() {
if (value == null) {
throw new NoSuchElementException("No value present");
}
return value;
}
T orElseThrow(Supplier<? extends X> exceptionSupplier)
null 则抛异常 并处理
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
if (value != null) {
return value;
} else {
throw exceptionSupplier.get();
}
}
中间 : 中间可参考stream , 不是Optional的专属
总结
各种设计模式,是程序员之间沟通的桥梁 , 统一的语言标准,才知道你丫的要干什么