一、optional类
Optional.of(user) //user为空会报空指针异常
Optional.ofNullable(user) //不会报异常
1、访问Optional对象的值
必须对使用get方法校验获取值是否为空,否则报NoSuchElementException
is.Persent() //默认flase,如果有值为true
该方法除了执行检查,还接受一个Consumer(消费者) 参数,如果对象不是空的,就对执行传入的 Lambda 表达式
2、获取值时,如果为空返回默认值
Optional 类提供了 *orElse()*如果有值则返回该值,否则返回传递给它的参数值:
@Test
public void whenEmptyValue_thenReturnDefault() {
User user = null;
User user2 = new User("anna@gmail.com", "1234");
User result = Optional.ofNullable(user).orElse(user2);
assertEquals(user2.getEmail(), result.getEmail());
}
*orElseGet()*会在有值的时候返回值,如果没有值,它会执行作为参数传入的 Supplier(供应者) 函数式接口,并将返回其执行结果
User result = Optional.ofNullable(user).orElseGet( () -> new user("2231","21345"));
user为空时new user对象并返回;
orElseGet()与orElse()
两个 Optional 对象都包含非空值,两个方法都会返回对应的非空值。不过,orElse() 方法仍然创建了 User 对象。与之相反,*orElseGet()* 方法不创建 **User** 对象。
3、获取值时,如果为空返回异常
Optional 还定义了 orElseThrow() API —— 它会在对象为空的时候抛出异常,而不是返回备选的值:
@Test(expected = IllegalArgumentException.class)
public void whenThrowException_thenOk() {
User result = Optional.ofNullable(user)
.orElseThrow( () -> new IllegalArgumentException());
}
如果 user 值为 null,会抛出 IllegalArgumentException。
4、转换值和过滤值
转换值
Optional 类的链式方法
public class User {
private String position;
public Optional<String> getPosition() {
return Optional.ofNullable(position);
}
//将返回的值包装在 Optional 中,
//...
}
//返回值为解除包装的String值
public void getValue{
....
String position =
Optioonal.ofNullable(user).flatMap(
u->u.getPosition().orElse("....."))
}
过滤值
*filter()* 接受一个 *Predicate* 参数,返回测试结果为 true 的值。如果测试结果为 false,会返回一个空的 Optional。
二、异常类捕获或validate
全局异常类
自定义异常类继承RuntimeException类,
定义异常类中所要注入的信息(成员变量);
全局异常类:@controllerAdvice
在方法上捕获异常类型
@ExceptionHandler(value=异常类.class)
方法(异常类 e){
e.getxxx();
//捕获异常之后,所要执行的逻辑
}
三、工具包
String.valueof()
Strings.isNullOrEmpty(str); // from spring-core
CollectionUtils.isEmpty(col);// from spring-core
StringUtils.isEmpty() //commons.lang3
Assert类:Assert.notNull()、Assert.hasLength()