user.getAddress().getProvince();
Esta forma de escribir puede provocar una excepción NullPointerException cuando el usuario es nulo. Para resolver este problema, se adopta el siguiente método de escritura
if(user!=null){
Address address = user.getAddress();
if(address!=null){
String province = address.getProvince();
}
}
Este tipo de escritura es relativamente fea, para evitar la escritura fea mencionada anteriormente, haga que el diseño feo sea elegante. JAVA8 proporciona la clase Opcional para optimizar este método de escritura, que se explicará en detalle en el siguiente texto.
1、 Opcional(Tvalue) vacío() de(Tvalue) deNullable(Tvalue)
Existe una correlación entre estas cuatro funciones, por eso se juntan para la memoria.
de (valor T)
Cuando el valor está vacío, se seguirá informando NullPointerException.
Cuando el valor del Valor no está vacío, el objeto Opcional se puede construir normalmente.
vacío()
empty()
La función es devolver el objeto VACÍO.
de Nullable (valor T)
La diferencia en comparación of(T value)
es que cuando el valor es nulo, of(valor T) informará NullPointerException; ofNullable(T value)
no arrojará una excepción y ofNullable(T value)
devolverá directamente un EMPTY
objeto.
No quiero esconderme NullPointerException
. En cambio, es necesario informarlo inmediatamente, en cuyo caso se utiliza la función Of.
2、 orElse(Tother), orElseGet(Proveedor<?extendsT>otro) y oElseThrow(Proveedor<?extendsX>excepciónProveedor);
orElse
El uso de y orElseGet
es el siguiente, lo que equivale a dar un valor predeterminado cuando el valor es nulo:
@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;
}
La diferencia entre estas dos funciones: cuando el valor del usuario no es nulo, orElse
la función aún ejecutará el método createUser (), pero orElseGet
no ejecutará el método createUser ().
orElseThrow significa que cuando el valor es nulo, se lanza directamente una excepción, el uso es el siguiente
User user = null;
Optional.ofNullable(user).orElseThrow(()->new Exception("用户不存在"));
3 、 map(Function<?superT,?extendsU>mapper)和flatMap(Function<?superT,Optional<U>>mapper)
;
No hay diferencia entre estas dos funciones en el cuerpo de funciones. La única diferencia es la entrada.
public class User {
private String name;
public String getName() {
return name;
}
}
En este momento, la forma de escribir el nombre es la siguiente:
String city = Optional.ofNullable(user).map(u-> u.getName()).get();
Para mapa plano:
Si la estructura del usuario es la siguiente
public class User {
private String name;
public Optional<String> getName() {
return Optional.ofNullable(name);
}
}
En este momento, la forma de escribir el nombre es la siguiente:
String city = Optional.ofNullable(user).flatMap(u-> u.getName()).get();
4、 isPresent() y ifPresent(Consumer<?superT>consumer);
isPresent
Es decir, determine si el valor está vacío y ifPresent
realice algunas operaciones cuando el valor no esté vacío.
Optional.ofNullable(user).ifPresent(u->{
// TODO: do something
});
5、 filtro(Predicado<?superT>predicado);
El método de filtro acepta un Opcional para filtrar los valores contenidos en él. Si los valores contenidos cumplen las condiciones, entonces este Opcional aún se devuelve; de lo contrario, se Predicate
devuelve .Optional
Optional.empty
Optional<User> user1 = Optional.ofNullable(user).filter(u -> u.getName().length()<6);
Como se muestra arriba, si la longitud del nombre del usuario es menor que 6, se devuelve. Si es mayor que 6, se devuelve un objeto VACÍO.
Uso práctico
método de escritura anterior
public String getCity(User user) throws Exception{
if(user!=null){
if(user.getAddress()!=null){
Address address = user.getAddress();
if(address.getCity()!=null){
return address.getCity();
}
}
}
throw new Excpetion("取值错误");
}
Método de escritura JAVA8
public String getCity(User user) throws Exception{
return Optional.ofNullable(user)//判断是否是null
.map(u-> u.getAddress())//不为null 取地址
.map(a->a.getCity())//不为null 取城市
.orElseThrow(()->new Exception("取指错误"));//为null 报错
}
método de escritura anterior
if(user!=null){
dosomething(user);
}
Método de escritura JAVA8
Optional.ofNullable(user)
.ifPresent(u->{
dosomething(u);
});
método de escritura anterior
public User getUser(User user) throws Exception{
if(user!=null){
String name = user.getName();
if("zhangsan".equals(name)){
return user;
}
}else{
user = new User();
user.setName("zhangsan");
return user;
}
}
método de escritura java8
public User getUser(User user) {
return Optional.ofNullable(user)
.filter(u->"zhangsan".equals(u.getName()))
.orElseGet(()-> {
User user1 = new User();
user1.setName("zhangsan");
return user1;
});
}