Una de las nuevas características: Java8 opcional Clase

nula palabra clave opcional no es un sustituto, sino más bien para el juicio nulo proporciona una implementación más elegante

NullPointException puede decir que todos los desarrolladores de Java ha encontrado una excepción, aunque java desde el diseño inicial a los programadores que tratan de salir del puntero de Oliver, pero el puntero es real, y el diseñador de Java sólo puede hacer puntero vuelto más simple, fácil de usar, pero no puede ser eliminado por completo, por lo que sólo las palabras clave que hemos visto en el lenguaje java diaria null.

Excepción de puntero nulo es una excepción de tiempo de ejecución, para este tipo de excepción si no hay una estrategia clara de tratamiento, la mejor práctica es permitir que el programa para colgar temprano, pero en muchas escenas, no el desarrollador hay una estrategia de tratamiento específico, sino simplemente no tiene conocimiento de la existencia de una excepción de puntero nulo. Cuando una excepción se produce, la estrategia de tratamiento es simple, añada una sentencia if para determinar donde hay poco común, pero las estrategias de afrontamiento como hacen nuestro programa cada vez más juicio nulo, sabemos que una buena la programación, el código debe permitir que tratar de parecer palabra clave menos nula, java8 ofrecido Optionalclases a reducir NullPointException, sino también mejorar el aspecto del código. Pero primero tenemos que tener claro que  no es para nulluna palabra clave alternativas, pero para el juicio nulo proporciona una implementación más elegante, evitando así NullPointException .

A. sentimientos intuitivos

Supongamos que tenemos que devolver la longitud de una cadena, si no utiliza las herramientas de terceros, es necesario llamar al str.length()método:

si (null == str) {// puntero nulo se determina 
    return 0; 
} 
str.length retorno ();

Opcional Si la clase, implementado como sigue:

retorno Optional.ofNullable (str) .map (String :: longitud) .orElse (0);

Opcional código relativamente más concisa, cuando el código es grande, es fácil olvidar a juicio nulo, pero el uso de clases opcionales evitará este tipo de problemas.

II. Uso básico

1. Creación de objetos

Crear un objeto nulo

Opcional <String> optStr = Optional.empty ();

El código de ejemplo anterior llama al empty()método crea un vacío Optional<String>de tipo de objeto.

Crear objetos: NO NULO
proporciona un método opcional of()objeto no nulo se utiliza para crear, este método requiere los parámetros de entrada no puede estar vacía, de lo contrario tirar NullPointException, los ejemplos son los siguientes:

Opcional <String> optStr = Optional.of (str); // si str es nulo cuando se lanza NullPointException

Crear objeto: permitido ser nula
si los parámetros de entrada no se puede determinar si la posibilidad de la presencia de un valor nulo, se puede utilizar el opcional ofNullable()crear un método de objeto, si el parámetro es nulo, se crea un objeto nulo. Ejemplos son los siguientes:

Opcional <String> optStr = Optional.ofNullable (str); // Si str es nulo, a continuación, crear un objeto vacío

2. Transmisión

El streaming es java8 nos trajo una nueva característica de peso pesado, vamos conjunto de operaciones para ser más concisa y eficiente, el siguiente artículo sobre nuevas características java8, se ocupará de la pérdida de una explicación completa. Aquí opcional también proporciona dos tratamiento de la pérdida básica: mapeo y filtrado.

Para demostrarlo, hemos diseñado una Userclase, de la siguiente manera:

/ ** 
 * @author: 09/24/2016 15:36:56 zhenchao.Wang 
 * / 
usuario public class { 

    / ** *用户编号/ 
    larga Identificación del privado; 

    private String nombre; 

    int edad privada; 

    Opcional <Larga> teléfono privado; 

    Opcional <String> correo electrónico privado; 

    Usuario pública (String nombre, edad int) { 
        this.name = nombre; 
        this.age = edad; 
    } 

    //省略colocador和captador 
}

Teléfono y correo electrónico no es un hombre para estar allí, así que usamos definición opcional.

Mapa: mapa y flatMap
operación de correlación para convertir una entrada en otra forma de salida, como el ejemplo anterior, tenemos la cadena de entrada, y la salida es la longitud de la cadena, esto es una pista, el método que utilizamos map()para logrado. Supongamos que queremos obtener el nombre de una persona, entonces podemos lograr lo siguiente:

String name = Optional.ofNullable .map (usuario) (User :: getName) .orElse ( "sin nombre");

De manera que cuando el parámetro de usuario no está vacío cuando se devuelve su nombre, de lo contrario no name , como espero que obtenemos teléfono o correo electrónico a través de la forma anterior, la forma de utilizar el anterior no funciona, porque el retorno después de que el mapa es opcional, llamamos a esto opcional llamado de anidación, debemos una vez con el fin de obtener los resultados que queremos en el mapa:

telefónico de larga = optUser.map (usuario :: getPhone) .map (Opcional :: get) .orElse (1L);

De hecho, esta vez, de una manera mejor es usar flatMap, paso para obtener los resultados que queremos:

telefónico de larga = optUser.flatMap (usuario :: getPhone) .orElse (1L);

flapMap cada flujo puede ser devuelto por el método de aplanado en una corriente, en particular un artículo de streaming dedicado inferior detalles.

Filtro: Fliter
filiter, como el nombre sugiere es una operación de filtro, podemos pasar la operación de filtración como un parámetro para el método, a fin de lograr el propósito de la filtración, queremos filtro se añadió durante 18 adultos, puede lograrse como sigue:

optUser.filter (u -> u.getAge ()> = 18) .ifPresent (u -> System.out.println ( "Adulto:" + u));

3. El comportamiento por defecto

El comportamiento predeterminado es cuando no se satisface realiza la operación de condición opcional, por ejemplo, en el ejemplo anterior usamos orElse()es una acción predeterminada de objeto opcional para llevar a cabo una acción específica está vacía, por supuesto, hay algún tipo de acción por defecto cuando la condición la operación que se realiza en presencia de un objeto.

Get ()
se acostumbran a obtener el valor de una variable, pero cuando la variable no existe será lanzado NoSuchElementException, así que no sé si existe la variable, no se recomienda su uso

OrElse (T otra)
cuando satisface variable opcional la condición predeterminada, se realiza OrElse, tales como cuando el str frontal es nulo, se devuelve 0.

orElseGet (<? extiende X> Proveedor expectionSupplier)
Si no se establecen las condiciones, es necesario realizar la lógica relativamente complejo, en lugar de simplemente volver a la operación, puede utilizar orElseGet logra:

telefónico de larga = optUser.map (usuario :: getPhone) .map (Opcional :: get) .orElseGet (() -> { 
    // hacer algo aquí 
    volver 1L; 
});

orElseThrow (Proveedor <? extiende X> expectionSupplier)
similar a los get () devuelve una excepción cuando no se cumplen todas las condiciones, pero aquí se puede especificar el tipo de excepción devuelta.

ifPresent (Consumer <? súper T> )
realiza parámetro de operación pasa cuando se satisface la condición.

III. Precauciones

Opcional es una clase final no implementa ninguna interfaz, por lo que cuando utilizamos la definición del atributo de clase de envases de clase, si definimos las clases tienen necesidades de serialización, a fin de no poner en práctica Serializable interfaz opcional, esta vez para realizar la serialización la operación será un problema:

la clase User los implementos de {Serializable pública 

    / número de usuario ** * / 
    privada de largo Identificación; 

    private String nombre; 

    private int Edad; 

    Privada Opcional La <Larga> Teléfono; // no puede ser serializado 

    opcional <String> correo electrónico privado; // no se puede serializar

Sin embargo, podemos utilizar la siguiente política de sustitución:

telefónico de larga privada; 

pública opcional <Larga> getPhone () { 
    volver Optional.ofNullable (this.phone); 
}

Parece opcional cuando el diseño no considera que sea utilizado como una especie de campo -

Publicó un artículo original · ganado elogios 1 · vistas 71

Supongo que te gusta

Origin blog.csdn.net/f_u_c_k_le/article/details/105278616
Recomendado
Clasificación