为了解决当值为 null 的时候会报错 NullPointerException 导致程序崩溃退出,以及Debug定位到错误代码难的痛点。Optional 是一个容器来包装对象,它可能包含值也可能为空值。
方法 | 说明 | |
Optional.of () Optional.ofNullable () Optional.empty () | 创建Optional对象 | 包装对象不为null(否则空指针异常) 包装对象可为null 包装对象为null |
isPresent () | 包装对象值是否存在(不要使用if当作传统null判断使用,违背设计初衷) | |
get () | 获取包装对象的值(如果为null,报错NoSuchElementException) | |
orElse (T other) | 获取包装对象的值,有值就返回,为null返回传入的默认值(类型和包装对象的类型一样) | |
orElseGet (Supplier other) | 获取包装对象的值,有值就返回,为null返回函数的值 | |
orElseThrow (Supplier exceptionSupplier) | 获取包装对象的值,有值就返回,为null返回一个Throwable对象 | |
ifPresent (Consumer consumer) | 如果包装对象的值不为null,对包装对象进行消费 | |
filter (Predicate predicate) | 符合判断就返回Optional本身,否则返回包装对象值为null的Optional | |
map (Function mapper) | 对包装对象进行函数运算 | |
flatMap () | 将一个二维的Optional对象映射成一个一维的对象 |
main() {
Person person = new Person("张三", 18);
//创建对象
Optional<Person> optionalPerson = Optional.of(person); //包装对象不为null的Optional实例(传入null值报错NullPointerException)
Optional<Person> optionalNullable = Optional.ofNullable(person); //包装对象可为null
Optional<Object> optionalEmpty = Optional.empty(); //包装对象值为null
//判断包装对象值是否存在 isPresent()
boolean isPersonExist = optionalPerson.isPresent();
//获取包装对象值(需先判断存在) get()
Person person1 = optionalPerson.get(); //如果值为null,报错NoSuchElementException
//获取包装对象值,有值则返回,否则返回默认值 orElse()
Person personElse = optionalPerson.orElse(new Person("李四", 22));
}
//传统null判断
public String getName(Person person) {
if (person == null) {
return "Unknown";
}
return person.getName();
}
//相比传统null判断,Optional写法更简便
public String getName2(Person person) {
return Optional.ofNullable(person).map(p -> p.getName()).orElse("Unknown");
}