Novas Funcionalidades do Java 11

JavaBeginner
Pratique Agora

Introdução

O Java 11 foi lançado em setembro de 2018 e introduziu muitos novos recursos e mudanças na plataforma. Este laboratório irá guiá-lo através do processo de começar a usar o Java 11 e explorar seus novos recursos.

Configurando o Ambiente

Primeiro, certifique-se de que o JDK 11 está instalado em seu sistema. Você pode verificar isso executando o seguinte comando em seu terminal:

java -version

Se o Java 11 não estiver instalado, você pode baixá-lo do site da Oracle ou usar um gerenciador de pacotes como apt-get ou yum.

Depois que o JDK estiver configurado, crie um arquivo Java com o seguinte comando:

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

Agora que o arquivo Java foi criado, abra-o em seu editor de texto favorito.

touch MyFirstJavaProgram.java

Executando Arquivos Java

Antes do Java 11, tínhamos que compilar um arquivo Java usando o comando javac e, em seguida, executá-lo usando o comando java. Com o Java 11, podemos executar diretamente um arquivo Java usando apenas o comando java.

No arquivo MyFirstJavaProgram.java, adicione o seguinte código:

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

Salve o arquivo e execute-o usando o seguinte comando:

java MyFirstJavaProgram.java

Você deve ver "Hello, Java 11!" impresso no console.

Novos Métodos de String

O Java 11 introduziu alguns novos métodos na classe String. Nesta etapa, exploraremos esses novos métodos.

Método isBlank()

O método isBlank() é usado para verificar se uma string está em branco ou não. Uma string vazia ou uma string com apenas espaços em branco é considerada em branco.

No arquivo MyFirstJavaProgram.java, adicione o seguinte código:

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

System.out.println("s1 is blank: " + s1.isBlank());
System.out.println("s2 is blank: " + s2.isBlank());
System.out.println("s3 is blank: " + s3.isBlank());

Salve o arquivo e execute-o usando o seguinte comando:

javac MyFirstJavaProgram.java
java MyFirstJavaProgram

Você deve ver a seguinte saída:

s1 is blank: true
s2 is blank: true
s3 is blank: false
Métodos strip(), stripLeading() e stripTrailing()

Os métodos strip(), stripLeading() e stripTrailing() são usados para remover espaços em branco de uma string. Eles são semelhantes ao método trim() existente, mas fornecem suporte Unicode.

No arquivo MyFirstJavaProgram.java, adicione o seguinte código:

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

Salve o arquivo e execute-o usando o seguinte comando:

javac MyFirstJavaProgram.java
java MyFirstJavaProgram

Você deve ver a seguinte saída:

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

Controle de Acesso Baseado em Nest

O Java 11 introduziu um novo recurso que nos permite acessar membros privados de uma classe aninhada usando a API Reflection. Nesta etapa, exploraremos esse novo recurso.

No arquivo MyFirstJavaProgram.java, adicione o seguinte código:

public class Demo {
    private void privateMethod() {
        System.out.print("Private Method");
    }
    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()));
    }
}

Salve o arquivo e execute-o usando o seguinte comando:

javac MyFirstJavaProgram.java
java MyFirstJavaProgram

Você deve ver a seguinte saída:

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

Novos Métodos de Arquivo

O Java 11 introduziu alguns novos métodos na classe Files que facilitam a leitura e a escrita de strings. Nesta etapa, exploraremos esses novos métodos.

No arquivo MyFirstJavaProgram.java, adicione o seguinte 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");
        //Writing to the file
        Files.writeString(path, "Hello World");
        //Reading from the file
        String s = Files.readString(path);
        System.out.print(s);
    }
}

Salve o arquivo e execute-o usando o seguinte comando:

javac MyFirstJavaProgram.java
java MyFirstJavaProgram

Você deve ver a seguinte saída:

Hello World

Conversão de Coleção para Array

O Java 11 introduziu um novo método toArray() padrão que facilita a conversão de uma coleção em um array do tipo correto.

No arquivo MyFirstJavaProgram.java, adicione o seguinte 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));
    }
}

Salve o arquivo e execute-o usando o seguinte comando:

javac MyFirstJavaProgram.java
java MyFirstJavaProgram

Você deve ver a seguinte saída:

[5, 10, 15]

O Método not()

O Java 11 introduziu um novo método not() na interface Predicate que é usado para negar um predicado. Nesta etapa, exploraremos este recurso.

No arquivo MyFirstJavaProgram.java, adicione o seguinte 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);
    }
}

Salve o arquivo e execute-o usando o seguinte comando:

javac MyFirstJavaProgram.java
java MyFirstJavaProgram

Você deve ver a seguinte saída:

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

Cliente HTTP

A API Cliente HTTP (HTTP Client API) foi introduzida no Java 9 e tornou-se padrão no Java 11. Nesta etapa, exploraremos como usar a nova API Cliente HTTP.

No arquivo MyFirstJavaProgram.java, adicione o seguinte 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());
    }
}

Salve o arquivo e execute-o usando o seguinte comando:

javac MyFirstJavaProgram.java
java MyFirstJavaProgram

Você deve ver o código HTML da página inicial do Google no console.

Sintaxe de Variável Local para Lambda

O Java 11 introduziu a palavra-chave var para nos permitir usar a sintaxe de variável local para expressões lambda. Nesta etapa, exploraremos este novo recurso.

No arquivo MyFirstJavaProgram.java, adicione o seguinte 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"));
    }
}

Salve o arquivo e execute-o usando o seguinte comando:

javac MyFirstJavaProgram.java
java MyFirstJavaProgram

Você deve ver true impresso no console.

Epsilon Garbage Collector

O Java 11 introduziu um novo recurso experimental chamado Epsilon garbage collector, que aloca memória, mas nunca coleta lixo (garbage). Nesta etapa, exploraremos este recurso experimental.

No arquivo MyFirstJavaProgram.java, adicione o seguinte 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");
    }
}

Salve o arquivo e execute-o usando o seguinte comando:

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

Você deve ver "Allocated 1GB of memory" impresso no console, seguido pela saída do programa com o código 0.

Resumo

Neste laboratório, você aprendeu sobre os novos recursos introduzidos no Java 11, incluindo novos métodos String, controle de acesso baseado em aninhamento (nest based access control), novos métodos de arquivo e muito mais. Você também aprendeu como usar a nova API HTTP Client e o Epsilon garbage collector. Agora você deve ter uma melhor compreensão do Java 11 e suas capacidades.