用途 : 解决npe
1
user.getAddress().getProvince();
上面的代码可能会出现NPE, 于是常常有以下代码:
1
2
3
4
5
6
if(user!=null){
Address address = user.getAddress();
if(address!=null){
String province = address.getProvince();
}
}
这样子的写法就很丑陋, 于是有了Optional
Optional类主要是内部维护了一个value的对象, 并且提供了一系列的方法对此value做逻辑操作。
Optional 方法
Optional(T value), empty(), of(T value), ofNullable(T value)
- Optional(T value)私有方法,只能内部创建
- empty()创建一个值为空的Optional对象
- of(T value)创建一个Optional对象,当值为空时, 抛NPE
- ofNullable(T value)创建一个新的Optional对象,当值为空时,创建一个空的Optional对象
orElse(T other), orElseGet(Supplier<? extends T> others), orElseThrow(Supplier<? extends X> exceptionSupplier)
这三组函数都是在传入的值为null时,进行调用。
- orElse(T other) 传入的值为null时调用, 不为null时也调用
- orElseGet(Supplier<? extends T> others) 传入的值为null时调用, 不为null是不调用。
1 2 3 4 5 6 7 8 9 10 11 12 13
@Test public void test() { User user = null; user = Optional.ofNullable(user).orElse(createUser()); user = Optional.ofNullable(user).orElseGet(() -> createUser()); } public User createUser(){ User user = new User(); user.setName("zhangsan"); return user; }
- orElseThrow(Supplier<? extends X> exceptionSupplier) 传入的值为null是抛出一个异常
map(Function<? super T, ? extends U> mapper)和flatMap(Function<? super T, Optional> mapper)
两者的区别就是
1 2 3 4 5 6
public class User { private String name; public String getName() { return name; } }
1 2 3 4 5 6
public class User { private String name; public Optional<String> getName() { return Optional.ofNullable(name); } }
isPresent()和ifPresent(Consumer<? super T> consumer)
这两组就是ifPresent就是在value值不为空时,做一些操作
- isPresent() 返回value是否为空
- ifPresent(Consumer<? super T> consumer), 如果value不为空的时候,将其作为consumer函数的入参进行消费操作。
filter(Predicate<? super T> predicate)
1 2 3 4 5 6 7 8 9 10
public final class Optional<T> { //省略.... public Optional<T> filter(Predicate<? super T> predicate) { Objects.requireNonNull(predicate); if (!isPresent()) return this; else return predicate.test(value) ? this : empty(); } }
接受一个Predicate入参对Optional中的值做一个过滤操作,