Nuevas Características de Java 11

JavaBeginner
Practicar Ahora

Introducción

Java 11 se lanzó en septiembre de 2018 y presentó muchas nuevas características y cambios en la plataforma. Esta práctica te guiará en el proceso de inicio con Java 11 y la exploración de sus nuevas características.

Configuración del Entorno

Primero, asegúrate de que el JDK 11 esté instalado en tu sistema. Puedes verificarlo ejecutando el siguiente comando en tu terminal:

java -version

Si Java 11 no está instalado, puedes descargarlo desde el sitio web de Oracle o usar un administrador de paquetes como apt-get o yum.

Una vez que se ha configurado el JDK, crea un archivo Java con el siguiente comando:

mkdir -p ~/project && cd ~/project
touch MyFirstJavaProgram.java

Ahora que se ha creado el archivo Java, dile a tu editor de texto favorito que lo abra.

touch MyFirstJavaProgram.java

Ejecutando archivos Java

Antes de Java 11, teníamos que compilar un archivo Java usando el comando javac y luego ejecutarlo usando el comando java. Con Java 11, podemos ejecutar directamente un archivo Java usando solo el comando java.

En el archivo MyFirstJavaProgram.java, agrega el siguiente código:

public class MyFirstJavaProgram {
    public static void main(String[] args) {
        System.out.println("Hello, Java 11!");
    }
}

Guarda el archivo y ejecútalo usando el siguiente comando:

java MyFirstJavaProgram.java

Deberías ver "Hello, Java 11!" impreso en la consola.

Nuevos métodos de String

Java 11 introdujo algunos nuevos métodos en la clase String. En este paso, exploraremos esos nuevos métodos.

Método isBlank()

El método isBlank() se utiliza para comprobar si una cadena está en blanco o no. Una cadena vacía o una cadena con solo espacios en blanco se considera en blanco.

En el archivo MyFirstJavaProgram.java, agrega el siguiente código:

String s1 = "";
String s2 = "    ";
String s3 = "String";

System.out.println("s1 está en blanco: " + s1.isBlank());
System.out.println("s2 está en blanco: " + s2.isBlank());
System.out.println("s3 está en blanco: " + s3.isBlank());

Guarda el archivo y ejecútalo usando el siguiente comando:

javac MyFirstJavaProgram.java
java MyFirstJavaProgram

Deberías ver la siguiente salida:

s1 está en blanco: true
s2 está en blanco: true
s3 está en blanco: false
Métodos strip(), stripLeading() y stripTrailing()

Los métodos strip(), stripLeading() y stripTrailing() se utilizan para eliminar los espacios en blanco de una cadena. Son similares al método existente trim() pero ofrecen soporte para Unicode.

En el archivo MyFirstJavaProgram.java, agrega el siguiente código:

String s = "   String   ";
System.out.println("$" + s + "$");
System.out.println("$" + s.strip() + "$");
System.out.println("$" + s.stripLeading() + "$");
System.out.println("$" + s.stripTrailing() + "$");

Guarda el archivo y ejecútalo usando el siguiente comando:

javac MyFirstJavaProgram.java
java MyFirstJavaProgram

Deberías ver la siguiente salida:

$   String   $
$String$
$String   $
$   String$

Control de Acceso Basado en Niveles Anidados

Java 11 introdujo una nueva característica que nos permite acceder a los miembros privados de una clase anidada utilizando la API de reflexión. En este paso, exploraremos esta nueva característica.

En el archivo MyFirstJavaProgram.java, agrega el siguiente código:

public class Demo {
    private void privateMethod() {
        System.out.print("Método Privado");
    }
    class NestedClass {
        public void callPrivateMethod() {
            privateMethod();
        }
    }
    public static void main(String[] args) {
        System.out.println(Demo.class.isNestmateOf(Demo.NestedClass.class));
        System.out.println(Demo.NestedClass.class.isNestmateOf(Demo.class));
        System.out.println(Demo.NestedClass.class.getNestHost());
        System.out.println(Arrays.toString(Demo.class.getNestMembers()));
    }
}

Guarda el archivo y ejecútalo usando el siguiente comando:

javac MyFirstJavaProgram.java
java MyFirstJavaProgram

Deberías ver la siguiente salida:

true
true
class Demo
[class MyFirstJavaProgram$Demo$NestedClass]

Nuevos métodos de archivo

Java 11 introdujo algunos nuevos métodos en la clase Files que facilitan la lectura y escritura de cadenas. En este paso, exploraremos estos nuevos métodos.

En el archivo MyFirstJavaProgram.java, agrega el siguiente código:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;

public class Demo {
    public static void main(String[] args) throws IOException {
        Path path = Files.createTempFile("temporaryFile", ".txt");
        //Escribiendo en el archivo
        Files.writeString(path, "Hello World");
        //Leyendo del archivo
        String s = Files.readString(path);
        System.out.print(s);
    }
}

Guarda el archivo y ejecútalo usando el siguiente comando:

javac MyFirstJavaProgram.java
java MyFirstJavaProgram

Deberías ver la siguiente salida:

Hello World

Colección a un arreglo

Java 11 introdujo un nuevo método predeterminado toArray() que facilita la conversión de una colección a un array del tipo correcto.

En el archivo MyFirstJavaProgram.java, agrega el siguiente código:

import java.util.ArrayList;
import java.util.Arrays;

public class Demo {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(5);
        list.add(10);
        list.add(15);

        Integer[] intArr = list.toArray(Integer[]::new);
        System.out.print(Arrays.toString(intArr));
    }
}

Guarda el archivo y ejecútalo usando el siguiente comando:

javac MyFirstJavaProgram.java
java MyFirstJavaProgram

Deberías ver la siguiente salida:

[5, 10, 15]

El método not()

Java 11 introdujo un nuevo método not() en la interfaz Predicate que se utiliza para negar un predicado. En este paso, exploraremos esta característica.

En el archivo MyFirstJavaProgram.java, agrega el siguiente código:

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class Demo {
    public static void main(String[] args) {
        Predicate<String> startWithZ = s -> s.charAt(0) == 'z';
        Predicate<String> doesNotStartWithZ = Predicate.not(startWithZ);

        List<String> list = Arrays.asList("za", "zq", "az", "aq", "zz");
        List<String> strsStartingWithZ = list.stream()
              .filter(startWithZ)
              .collect(Collectors.toList());
        List<String> strsNotStartingWithZ = list.stream()
              .filter(doesNotStartWithZ)
              .collect(Collectors.toList());

        System.out.println(strsStartingWithZ);
        System.out.println(strsNotStartingWithZ);
    }
}

Guarda el archivo y ejecútalo usando el siguiente comando:

javac MyFirstJavaProgram.java
java MyFirstJavaProgram

Deberías ver la siguiente salida:

[za, zq, zz]
[az, aq]

Cliente HTTP

La API de Cliente HTTP se introdujo en Java 9 y se convirtió en estándar en Java 11. En este paso, exploraremos cómo utilizar la nueva API de Cliente HTTP.

En el archivo MyFirstJavaProgram.java, agrega el siguiente código:

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;

public class Demo {
    public static void main(String[] args) throws Exception {
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
             .uri(new URI("https://www.google.com"))
             .GET()
             .build();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8));
        System.out.println(response.body());
    }
}

Guarda el archivo y ejecútalo usando el siguiente comando:

javac MyFirstJavaProgram.java
java MyFirstJavaProgram

Deberías ver el código HTML de la página de inicio de Google en la consola.

Sintaxis de variable local para Lambda

Java 11 introdujo la palabra clave var para permitir el uso de la sintaxis de variables locales para expresiones lambda. En este paso, exploraremos esta nueva característica.

En el archivo MyFirstJavaProgram.java, agrega el siguiente código:

import java.util.function.Predicate;

public class Demo {
    public static void main(String[] args) {
        Predicate<String> startsWithZ = (@NotNull var str) -> str.charAt(0) == 'z';
        System.out.println(startsWithZ.test("zoo"));
    }
}

Guarda el archivo y ejecútalo usando el siguiente comando:

javac MyFirstJavaProgram.java
java MyFirstJavaProgram

Deberías ver true impreso en la consola.

Recolector de basura Epsilon

Java 11 introdujo una nueva característica experimental llamada recolector de basura Epsilon, que asigna memoria pero nunca recopila basura. En este paso, exploraremos esta característica experimental.

En el archivo MyFirstJavaProgram.java, agrega el siguiente código:

public class Demo {
    public static void main(String[] args) {
        byte[] b = new byte[1024 * 1024 * 1024];
        System.out.println("Allocated 1GB of memory");
    }
}

Guarda el archivo y ejecútalo usando el siguiente comando:

java -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC MyFirstJavaProgram.java

Deberías ver "Allocated 1GB of memory" impreso en la consola, seguido de que el programa salga con código 0.

Resumen

En este laboratorio, aprendiste sobre las nuevas características introducidas en Java 11, incluyendo nuevos métodos de String, control de acceso basado en anidamiento, nuevos métodos de archivo y más. También aprendiste cómo utilizar la nueva API de Cliente HTTP y el recolector de basura Epsilon. Ahora deberías tener una mejor comprensión de Java 11 y sus capacidades.