java 8 opcional

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 EMPTYobjeto.

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);

orElseEl uso de y orElseGetes 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, orElsela función aún ejecutará el método createUser (), pero orElseGetno 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);

isPresentEs decir, determine si el valor está vacío y ifPresentrealice 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  .OptionalOptional.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;
                   });
}

Supongo que te gusta

Origin blog.csdn.net/weixin_41018853/article/details/125989667
Recomendado
Clasificación