目录
知悉:
Java8为解决null值判断问题,引入Optional类。
本类可以避免显式的null值判断(null的防御性检查),避免null值导致的空指针异常(NPE:NullPointException);
三个主要方法:
三个方法,建议尽可能使用Optional.ofnullable()
(1)Optional.of()
将数据 转换成 Optional类型(获取具有指定类型的指定值的Optional类的实例)
可通过 .get()方法 获取原值
@Test
public void testOptionalOf() {
Optional<String> emptyStr = Optional.of("");
System.out.println(emptyStr); // 输出:Optional[]
Optional<String> str = Optional.of("abc");
System.out.println(str); // 输出:Optional[abc]
Optional<Integer> integer = Optional.of(123);
System.out.println(integer); // 输出:Optional[123]
Optional<String> optional = Optional.of("哦吼");
System.out.println(optional); // 输出:Optional[哦吼]
Optional<Object> o = Optional.of(null);
System.out.println(o); // 报错:空指针异常
}
源码:
public static <T> Optional<T> of(T value) {
return new Optional<>(value);
}
应用场景:
- 非常明确 将要传给 Optional.of(obj) 的 obj 参数不可能为 null 时
比如obj是一个刚new出来的对象,或者是一个非null常量。
- 想为 obj 断言非 null 时
比如 想要 obj 一旦为 null 就立即报告 NullPointerException 异常, 而不是隐藏
(2)Optional.ofnullable()
功能与Optional.of()相同,底层也应用了Optional.of()方法。
但是对 null 类型进行了判断,如果为null,则方法内部会 通过 Optional.empty()方法重新 new 一个新的空的 Optional进行返回。
@Test
public void testOptionalOfNullable() {
Optional<String> emptyStr = Optional.ofNullable("");
System.out.println(emptyStr); // 输出:Optional[]
Optional<String> str = Optional.ofNullable("abc");
System.out.println(str); // 输出:Optional[abc]
Optional<Integer> integer = Optional.ofNullable(123);
System.out.println(integer); // 输出:Optional[123]
Optional<String> optional = Optional.ofNullable("哦吼");
System.out.println(optional); // 输出:Optional[哦吼]
Optional<Object> o = Optional.ofNullable(null);
System.out.println(o); // 输出:Optional.empty
}
源码如下:
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
public static<T> Optional<T> empty() {
@SuppressWarnings("unchecked")
Optional<T> t = (Optional<T>) EMPTY;
return t;
}
private static final Optional<?> EMPTY = new Optional<>();
(3)Optional.empty()
重新new一个Optional(),并返回。
@Test
public void testOptionalEmpty() {
Optional<Object> empty = Optional.empty();
System.out.println(empty); // 输出:Optional.empty
}
源码如下
public static<T> Optional<T> empty() {
@SuppressWarnings("unchecked")
Optional<T> t = (Optional<T>) EMPTY;
return t;
}
private static final Optional<?> EMPTY = new Optional<>();
另:
部分stream流的返回值,其实也是Optional。如:
/**
* integer Comparator 对比 获取最大值
*/
@Test
public void testMaxInt() {
// 1、自定义排序
Optional<Integer> max2 = intList.stream().max(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
});
// 简化
Optional<Integer> max3 = intList.stream().max((o1, o2) -> o1.compareTo(o2));
// 自然排序
Optional<Integer> max = intList.stream().max(Integer::compareTo);
System.out.println("自然排序的最大值:" + max.get());
System.out.println("自定义排序的最大值:" + max2.get());
}