Prefacio
No hay duda de que Java 8 es la versión más importante de Java desde Java 5 (lanzado en 2004). Esta versión contiene más de una docena de nuevas características en idiomas, compiladores, bibliotecas, herramientas y JVM.
Java 8 es una versión principal de Java. Algunas personas creen que, aunque los desarrolladores de Java esperan estas nuevas características, también requiere mucho esfuerzo para aprender. A continuación, este artículo le presentará los detalles de las nuevas funciones opcionales, métodos predeterminados y métodos estáticos en Java 8. Sin más preámbulos, echemos un vistazo a la introducción detallada.
Opcional
La clase opcional ( java.util.Optional ) es una clase de contenedor que representa si un valor existe o no existe. Solía usar NULL para indicar que no existe un valor. Ahora opcional puede expresar mejor este concepto. Y puede evitar excepciones de puntero nulo.
Métodos comunes:
Optional.of(T t) : crea una instancia opcional.Optional.empty() : crea una instancia opcional vacía.Optional.ofNullable(T t) Si t no es nulo, cree una instancia opcional, de lo contrario crear una instancia vacía.isPresent() : determina si el valor está incluido.orElse(T t) : devuelve el valor si el objeto de llamada contiene un valor, de lo contrario devuelve t.orElseGet(Supplier s) : devuelve el valor si el objeto de llamada contiene un valor, de lo contrario devuelve el valor obtenido por s.map(Function f) Si hay un valor para procesarlo y devuelve el opcional procesado, de lo contrario devuelve Optional.empty()flatMap(Function mapper) es similar al MAP, lo que requiere que el valor de retorno sea opcional.El siguiente es un párrafo de ImportNew para decirnos cómo usar opcional correctamente. Por ejemplo, no lo escribas así:
public static String getName (User U) {Opcional <Ser User> User = Oppectional.ofNullable (U); if (! user.ispresent ()) return "desconocido"; return user.get (). name;}Esta reescritura no solo no es concisa, sino que también la operación es la misma que la primera pieza de código. No es más que usar el método ISPresent para reemplazar U == NULL. Tal reescritura no es el uso correcto de opcional, reescribamos nuevamente.
public static string getName (usuario u) {return Opcional.ofnullable (u) .map (user-> user.name) .orelse ("desconocido");}Esta es la forma correcta de usar opcional. Luego, según esta idea, podemos hacer llamadas de cadena con tranquilidad en lugar de hacer juicios en capa. Mira un código:
public Static String getChampionName (Competition Comp) arroja ilegalargumentException {if (comp! = null) {compResult dult = comp.getResult (); if (resultado! = null) {user Champion = result.getChampion (); if (campeón! = null) {return Champion.getName (); }}} tire nueva ilegalArgumentException ("El valor de Param Comp no está disponible");} Debido a varias razones (como: la competencia aún no ha producido un campeonato, llamadas anormales al método, un gran paquete de regalos enterrado en la implementación de un determinado método, etc.), no podemos ir felizmente hasta comp.getResult().getChampion().getName() . Otros idiomas como Kotlin proporcionan bendiciones del operador a nivel de sintaxis: comp?.getResult()?.getChampion()?.getName() Entonces, ¿qué debemos hacer en Java?
Veamos cómo se verán estos códigos después del soporte opcional.
public static string getChampionName (Competition Comp) lanza ilegalArgumentException {return Oppectional.ofNullable (comp) .map (c-> c.getResult ()) .map (r-> r.getChampion ()) .map (u-> u.getNeMEsto es muy cómodo. El encanto de opcional es más que eso. Opcional también tiene algunos usos mágicos, como opcionales que se pueden usar para probar la legalidad de los parámetros.
public void setName (nombre de cadena) lanza ilegalArgumentException {this.name = opcional.ofnullable (nombre) .filter (usuario :: isNameValid) .orelsethrow (()-> new IlegalArGumentException ("Inválido UserName");};El código anterior hace referencia a ImportNew - Java8 Cómo usar opcional correctamente.
Métodos predeterminados y estáticos en interfaces
Se pueden agregar métodos estáticos a la interfaz Java8, o se pueden agregar métodos predeterminados, y los métodos predeterminados se modifican con el valor predeterminado.
Interfaz public de la interfaz <T> {Void predeterminado getName () {System.out.println ("Hello World"); } static void getAge () {System.out.println ("nueve"); }}Si una interfaz define un método predeterminado, una clase principal de su clase de implementación define un método con el mismo nombre y lista de parámetros. Luego, cuando se llama a la clase de implementación, se ejecuta el método en la clase principal.
public class testf {public void getName () {system.out.println ("testf"); }} Public Interface TestInterface {Void predeterminado getName () {System.out.println ("Hello World"); }} La prueba de clase pública extiende testf implements testInterface {public static void main (string [] args) {test t = new test (); t.getName (); // La salida es testf}}Si una clase de implementación implementa dos interfaces, si una interfaz principal proporciona un método predeterminado y la otra interfaz principal también proporciona un método con el mismo nombre y lista de parámetros (independientemente de si el método es el método predeterminado), el método debe anularse para resolver el conflicto, de lo contrario se informará un error.
Interfaz pública TestInterface {Void predeterminado getName () {System.err.println ("Hello World"); }} Public Interface TestInterface1 {void getName ();} public class test1 implementa testInterface, testInterface1 {public void getName () {System.out.println ("tes1f"); }}Resumir
Lo anterior es todo el contenido de este artículo. Espero que el contenido de este artículo tenga cierto valor de referencia para el estudio o el trabajo de todos. Si tiene alguna pregunta, puede dejar un mensaje para comunicarse. Gracias por su apoyo a Wulin.com.