最近有时间,特将JDK8中新增的Optional的常用方法结合自己的使用和理解,总结一下!
Optional 可以看做一个容器:它可以保存各种类型的值,或者仅仅保存null,即Optional 类是一个可以为null的容器对象。Optional的优点是提供很多有用的方法,这样我们就不用显式进行空值检测而实现避免NullPointerException的情况。Optional 的常用方法查看相关源码就可以了解相应的用法。
常用的方法一个有10个,总结如下:
- static Optional of(T value)
获取一个值为非null的Optional实例,如果传入的参数为null,则报NullPointerException;@Test public void test(){ Optional<User> jim = Optional.of(new User("Jim", 20)); User user = jim.get(); System.out.println(user); } - static Optional empty()
看源码可知,该方法返回值为new Optional();返回一个空的Optional对象;
Optional empty = Optional.empty(); - static Optional ofNullable(T value)
查看该方法源码:
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
查看源码可看出此方法如果入参为null,则返回空的Optional对象,反之,则返回一个指定非null的Optional实例;
@Test
public void test(){
Optional<User> optional = Optional.ofNullable(new User("Jim",20));
User user = optional.get();//获取的user实例为new User("Jim",20)
}
- boolean isPresent()
该方法源码为:
/**
* Return {@code true} if there is a value present, otherwise {@code false}.
*
* @return {@code true} if there is a value present, otherwise {@code false}
*/
public boolean isPresent() {
return value != null;
}
调用者Optional容器对象中的值如果不为null,则返回TRUE;反之返回FALSE;
- void ifPresent(Consumer<? super T> consumer)
调用者Optional如果不为null,则执行实现Consumer接口对应的操作;反之什么也不处理; - T orElse(T other)
该方法的源码:
public T orElse(T other) {
return value != null ? value : other;
}
调用该方法的Optional(value)中的值如果为null,则返回入参指定的Optional实例;反之返回调用者自身;
orElse()的入参other可以看做是一个默认值;
@Test
public void test(){
Optional<User> empty = Optional.empty();
Optional<User> optional = Optional.of(new User("Jim", 20));
User tom1 = empty.orElse(new User("Tom", 21));
User tom2 = optional.orElse(new User("Tom", 21));
System.out.println(tom1);//User{name='Tom', age=21}
System.out.println(tom2);//User{name='Jim', age=20}
}
- T orElseGet(Supplier<? extends T> other)
如果调用者Optional中有值,则返回调用者中的值;反之,返回Supplier接口产生的返回值;
@Test
public void test(){
Optional<User> optional = Optional.empty();
User user = optional.orElseGet(() -> {
User jerry = new User("Jerry", 10);
return jerry;
});
System.out.println(user);
}
输出的结果是User{name=‘Jerry’, age=10};
8. T orElseThrow(Supplier<? extends X> exceptionSupplier)
参考方法源码:
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
if (value != null) {
return value;
} else {
throw exceptionSupplier.get();
}
}
如果调用者Optional中有值,则返回调用者中的值;反之,返回Supplier接口抛出的Exception;
@Test
public void test(){
Optional<User> optional = Optional.empty();
User user = optional.orElseThrow(() -> new DataNotExistException("值不存在"));
System.out.println(user);
}
因为调用者为空的Optional对象,故运行结果是抛出DataNotExistException;
9. Optional < U> map(Function<? super T, ? extends U> mapper)
如果Optional容器中有值,则执行对Function接口的Lambda表达式的逻辑;反之,Function接口就不会被调用,返回一个空的Optional容器;
Optional<User> optional = Optional.empty();
Optional<User> optional1 = optional.map(u -> {
u.setAge(11);
return u;
});
System.out.println(optional1.isPresent());
执行的结果为FALSE;
Optional<User> optional = Optional.of(new User("Jerry", 10));
Optional<User> optional1 = optional.map(u -> {
u.setAge(11);
return u;
});
System.out.println(optional1.get().getAge());
执行的结果为 11;
10. Optional< U> flatMap(Function< ? super T, Optional< U> > mapper)
flatMap()方法与map()方法类似,所不同的是map()方法的返回值为泛型,而flatMap()返回值必须封装为Optional;
@Test
public void test(){
Optional<User> optional = Optional.empty();
Optional<User> optional1 = optional.flatMap(u -> {
u.setAge(11);
return Optional.of(u);
});
System.out.println(optional1);
}
执行结果为:Optional.empty ,表明返回的是一个空的Optional;
@Test
public void test(){
Optional<User> optional = Optional.of(new User("Jerry", 10));
Optional<User> optional1 = optional.flatMap(u -> {
u.setAge(11);
return Optional.of(u);
});
System.out.println(optional1);
}
执行结果为:Optional[User{name=‘Jerry’, age=11}]
本文主要总结了JDK8中Optional类的常用方法,包括of、empty、ofNullable、isPresent、ifPresent、orElse、orElseGet、orElseThrow、map和flatMap等,通过实例展示了它们的功能和用法,帮助理解和避免NullPointerException。

3605

被折叠的 条评论
为什么被折叠?



