在平时的编程中,经常会遇到NullPointerException空指针异常。为避免这种异常的减少,我们经常在会进行层层判空,以达到自己想要的结果,代码会显得不太优雅。
例如:
if(approval != null){
List<Approval> approvals = approval.getApprovals();
if(approvals != null){
approvals.forEach(System.out::println);
}
}
为解决上面的优雅问题,JAVA8提供了Optional类来优化这种写法。
1.ofNullable Optional 中的ofNullable方法,当参数位空的时候,会返回空对象,不会抛出异常,来看下源码:
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
2、orElse(T other),orElseGet(Supplier<? extends T> other)和orElseThrow(Supplier<? extends X> exceptionSupplier)
当为空的时候,会执行后面的操作,或者抛出异常。
@org.junit.Test
public void test() throws Exception {
Approval user = null;
user = Optional.ofNullable(user).orElse(createUser());
System.out.println(JSON.toJSON(user));
user = null;
user = Optional.ofNullable(user).orElseGet(() -> createUser());
System.out.println(JSON.toJSON(user));
user = null;
Optional.ofNullable(user).orElseThrow(()->new Exception("审核不存在"));
}
public Approval createUser(){
Approval user = new Approval();
user.setApprovalName("哈哈");
return user;
}
此案例中对象为空,会去创建对象或者抛出异常
3、map(Function<? super T, ? extends U> mapper) 值转换操作
需要传入的是不是位空的参数,为空则会抛出异常。
@org.junit.Test
public void test() throws Exception {
Approval user = createUser();
String s = Optional.ofNullable(user).map(u -> u.getApprovalName()).get();
System.out.println(s);
}
public Approval createUser(){
Approval user = new Approval();
user.setApprovalName("哈哈");
return user;
}
4.isPresent()和ifPresent(Consumer<? super T> consumer)
isPresent
即判断value值是否为空,而ifPresent
就是在value值不为空时,所需要做什么。
@org.junit.Test
public void test() throws Exception {
Approval user = createUser();
Optional.ofNullable(user).ifPresent(u->{
u.setApprovalName("你好");
});
System.out.println(user);
}
public Approval createUser(){
Approval user = new Approval();
user.setApprovalName("哈哈");
return user;
}
5、filter(Predicate<? super T> predicate)过滤值操作:需要不为空的参数
@org.junit.Test
public void test() throws Exception {
Approval approval = createUser();
Approval approval1 = Optional.ofNullable(approval).filter(u -> u.getApprovalName().length() > 6).get();
System.out.println(approval1);
}
public Approval createUser(){
Approval user = new Approval();
user.setApprovalName("哈哈");
return user;
}