Optional类
在Java中,可能我们看过最多的异常就是java.lang.NullPointerException
,这是使用null
引用去调用一个方法或者字段的结果。
Java 8中提供了java.util.Optional<T>
类,是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且
可以避免空指针异常。
Optional
常用方法有以下这些:
- Optional.of(T t) : 创建一个 Optional 实例
- Optional.empty() : 创建一个空的 Optional 实例
- Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例
- T get():获取Optional中的值
- isPresent() : 判断是否包含值
- orElse(T t) : 如果调用对象包含值,返回该值,否则返回t
- orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值
- map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()
- flatMap(Function mapper):与 map 类似,要求返回值必须是Optional
Optional
的增加操作和他的创建一起,即增加一个元素便是创建一个Optional
实例。下面是创建容器的例子
@Test
public void test() {
// Optional.of(T t)
Optional<String> optional = Optional.of("321");
// 下面这句代码会报NullPointerException
Optional<String> optional2 = Optional.of(null);
// Optional.empty()
Optional<Object> emptyOptional = Optional.empty();
// Optional.ofNullable(T t)
Optional<String> nullableOptional = Optional.ofNullable("123");
// 下面这句代码不会报错,因为ofNullable(T t)创建Optional时允许t为null,相当于Optional.empty()
Optional<Object> nullableOptional2 = Optional.ofNullable(null);
}
通过get()
方法可以从Optional
实例中获取到存放的值。如
@Test
public void test() {
Optional<String> optional = Optional.of("123");
String str = optional.get();
System.out.println(str);//输出123
}
isPresent()
判断是否包含值,有点像是我们判断一个集合的size
是否大于0。如
@Test
public void test() {
Optional<String> optional = Optional.of("123");
boolean b = optional.isPresent();
System.out.println(b);// 输出true
optional = Optional.ofNullable(null);
b = optional.isPresent();
System.out.println(b);// 输出false
}
其它方法就不一一试验了,总之这个Optional
类其实就是一个封装了一个元素的容器,而这个元素可以是null
也可以是其它任意类型的。