Recursos do Java 9 com Exemplos

Java 9 é uma versão importante e trouxe muitos recursos para os desenvolvedores. Neste artigo, examinaremos detalhadamente os recursos do Java 9.

Java 10 foi lançado, para uma visão completa do lançamento do Java 10, consulte Recursos do Java 10.

Recursos do Java 9

Alguns dos recursos importantes do Java 9 são;

  1. Java 9 REPL (JShell)
  2. Métodos de Fábrica para Listas, Conjuntos, Mapas e Map.Entry Imutáveis
  3. Métodos Privados em Interfaces
  4. Sistema de Módulos do Java 9
  5. Melhorias na API de Processos
  6. Melhoria no Bloco Try With Resources
  7. Melhorias na API CompletableFuture
  8. Streams Reativas
  9. Operador Diamond para Classe Interna Anônima
  10. Melhorias na Classe Optional
  11. Melhorias na API de Streams
  12. Anotação @Deprecated Aprimorada
  13. Cliente HTTP 2
  14. API de Imagem de Multi-Resolução
  15. Recursos Diversos do Java 9

A Oracle Corporation vai lançar o Java SE 9 por volta do final de março de 2017. Nesta postagem, vou discutir brevemente os “Recursos do Java 9” com alguns exemplos.

Java 9 REPL (JShell)

A Oracle Corp introduziu uma nova ferramenta chamada “jshell”. Ela significa Java Shell e também é conhecida como REPL (Read Evaluate Print Loop). É usada para executar e testar facilmente qualquer construção Java, como classe, interface, enum, objeto, declarações, etc. Podemos baixar o software JDK 9 EA (Acesso Antecipado) em https://jdk9.java.net/download/

G:\>jshell
|  Welcome to JShell -- Version 9-ea
|  For an introduction type: /help intro


jshell> int a = 10
a ==> 10

jshell> System.out.println("a value = " + a )
a value = 10

Se você quiser saber mais sobre a ferramenta REPL, por favor, leia Java 9 REPL Basics (Parte 1) e Java 9 REPL Features (Parte 2).

Métodos de Fábrica para Listas, Conjuntos, Mapas e Map.Entry Imutáveis

A Oracle Corp introduziu alguns métodos de fábrica convenientes para criar objetos de Lista, Conjunto, Mapa e Map.Entry Imutáveis. Esses métodos de utilidade são usados para criar objetos de Coleção vazios ou não vazios. No Java SE 8 e em versões anteriores, podemos usar métodos de utilidade da classe Collections como unmodifiableXXX para criar objetos de Coleção Imutáveis. Por exemplo, se quisermos criar uma Lista Imutável, podemos usar o método Collections.unmodifiableList. No entanto, esses métodos Collections.unmodifiableXXX são uma abordagem tediosa e verbosa. Para superar essas deficiências, a Oracle Corp adicionou alguns métodos de utilidade às interfaces List e Set. As interfaces List e Set possuem métodos “of()” para criar objetos de Lista ou Conjunto Imutáveis vazios ou não vazios, como mostrado abaixo: Exemplo de Lista Vazia

List immutableList = List.of();

Exemplo de Lista Não Vazia

List immutableList = List.of("one","two","three");

O Mapa possui dois conjuntos de métodos: métodos of() e métodos ofEntries() para criar um objeto Mapa Imutável e um objeto Map.Entry Imutável, respectivamente. Exemplo de Mapa Vazio

jshell> Map emptyImmutableMap = Map.of()
emptyImmutableMap ==> {}

Exemplo de Mapa Não Vazio

jshell> Map nonemptyImmutableMap = Map.of(1, "one", 2, "two", 3, "three")
nonemptyImmutableMap ==> {2=two, 3=three, 1=one}

Se você quiser saber mais sobre esses métodos de utilidade, por favor, consulte os seguintes links:

Métodos Privados em Interfaces

No Java 8, podemos fornecer implementação de métodos em Interfaces usando métodos padrão e estáticos. No entanto, não podemos criar métodos privados em Interfaces. Para evitar código redundante e promover maior reutilização, a Oracle Corp vai introduzir métodos privados nas Interfaces do Java SE 9. A partir do Java SE 9, podemos escrever métodos privados e privados estáticos em uma interface usando a palavra-chave ‘private’. Esses métodos privados são como outros métodos privados de classe, não há diferença entre eles.

public interface Card{

  private Long createCardID(){
    // Implementação do método vai aqui.
  }

  private static void displayCardDetails(){
    // Implementação do método vai aqui.
  }

}

Se você deseja saber mais sobre esse novo recurso, por favor, acesse este link: Métodos Privados Java 9 em Interface.

Sistema de Módulos do Java 9

Uma das grandes mudanças ou recursos do Java 9 é o Sistema de Módulos. A Oracle Corp vai introduzir os seguintes recursos como parte do Projeto Jigsaw.

  • JDK Modular
  • Código Fonte Java Modular
  • Imagens de Tempo de Execução Modulares
  • Encapsulamento de APIs Internas do Java
  • Sistema de Módulos da Plataforma Java

Antes das versões do Java SE 9, estávamos usando Jars Monolíticos para desenvolver aplicações baseadas em Java. Esta arquitetura tem muitas limitações e desvantagens. Para evitar todas essas deficiências, o Java SE 9 vem com o Sistema de Módulos. O JDK 9 está vindo com 92 módulos (podem mudar na versão final). Podemos usar Módulos do JDK e também podemos criar nossos próprios módulos, como mostrado abaixo: Exemplo de Módulo Simples

module com.foo.bar { }

Aqui estamos usando ‘module’ para criar um módulo simples. Cada módulo tem um nome, código relacionado e outros recursos. Para ler mais detalhes sobre essa nova arquitetura e ter uma experiência prática, por favor, consulte meus tutoriais originais aqui:

Melhorias na API de Processo

O Java SE 9 traz algumas melhorias na API de Processo. Foram adicionadas algumas novas classes e métodos para facilitar o controle e gerenciamento de processos do sistema operacional. Duas novas interfaces na API de Processo:

Exemplo da API de Processo

 ProcessHandle currentProcess = ProcessHandle.current();
 System.out.println("Current Process Id: = " + currentProcess.getPid());

Melhoria no Try-With-Resources

Sabemos que o Java SE 7 introduziu uma nova construção de tratamento de exceção: Try-With-Resources para gerenciar recursos automaticamente. O principal objetivo dessa nova instrução é “Gerenciamento Automático de Recursos Melhorado”. O Java SE 9 irá fornecer algumas melhorias nesta instrução para evitar alguma verbosidade adicional e melhorar a legibilidade. Exemplo no Java SE 7

void testARM_Before_Java9() throws IOException{
 BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
 try (BufferedReader reader2 = reader1) {
   System.out.println(reader2.readLine());
 }
}

Exemplo no Java 9

void testARM_Java9() throws IOException{
 BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
 try (reader1) {
   System.out.println(reader1.readLine());
 }
}

Para saber mais sobre esse novo recurso, por favor, consulte meu tutorial original em: Java 9 Melhorias no Try-With-Resources

Melhorias na API CompletableFuture

No Java SE 9, a Oracle Corp vai melhorar a API CompletableFuture para resolver alguns problemas levantados no Java SE 8. Eles vão adicionar suporte para alguns atrasos e limites de tempo, alguns métodos de utilidade e melhor subclasse.

Executor exe = CompletableFuture.delayedExecutor(50L, TimeUnit.SECONDS);

Aqui, delayedExecutor() é um método de utilidade estático usado para retornar um novo Executor que submete uma tarefa para o executor padrão após o atraso dado.

Fluxos Reativos

Atualmente, a Programação Reativa se tornou muito popular no desenvolvimento de aplicações para obter alguns benefícios incríveis. Frameworks como Scala, Play, Akka, etc., já integraram Fluxos Reativos e estão obtendo muitos benefícios. A Oracle Corps também está introduzindo uma nova API de Fluxos Reativos no Java SE 9. A API de Fluxos Reativos do Java SE 9 é um Framework de Publicação/Assinatura para implementar aplicações Assíncronas, Escaláveis e Paralelas muito facilmente usando a linguagem Java. O Java SE 9 introduziu a seguinte API para desenvolver Fluxos Reativos em aplicações baseadas em Java.

  • java.util.concurrent.Flow
  • java.util.concurrent.Flow.Publisher
  • java.util.concurrent.Flow.Subscriber
  • java.util.concurrent.Flow.Processor

Leia mais em Java 9 Fluxos Reativos.

Operador de Diamante para Classe Anônima Interna

Sabemos que o Java SE 7 introduziu uma nova funcionalidade: o Operador de Diamante, para evitar código redundante e verbosidade, melhorando a legibilidade. No entanto, no Java SE 8, a Oracle Corp (Desenvolvedora da Biblioteca Java) identificou algumas limitações no uso do operador de diamante com classes internas anônimas. Essas questões foram corrigidas e serão lançadas como parte do Java 9.

  public List getEmployee(String empid){
     // Código para obter detalhes do funcionário do armazenamento de dados
     return new List(emp){ };
  }

Aqui estamos usando apenas “List” sem especificar o parâmetro de tipo.

Melhorias na Classe Optional

No Java SE 9, a Oracle Corp adicionou alguns novos métodos úteis à classe java.util.Optional. Aqui vou discutir sobre um desses métodos com um exemplo simples: o método stream. Se um valor estiver presente no objeto Optional fornecido, este método stream() retorna um Stream sequencial com esse valor. Caso contrário, retorna um Stream vazio. Eles adicionaram o método “stream()” para trabalhar em objetos Optional de forma preguiçosa, como mostrado abaixo:

Stream<Optional> emp = getEmployee(id)
Stream empStream = emp.flatMap(Optional::stream)

Aqui o método Optional.stream() é usado para converter um Stream de Optional de objeto Employee em um Stream de Employee para que possamos trabalhar neste resultado de forma preguiçosa no código resultante. Para entender mais sobre esse recurso com mais exemplos e para ler mais novos métodos adicionados à classe Optional, por favor, consulte meu tutorial original em: Java SE 9: Melhorias na Classe Optional

Melhorias na API de Stream

Em Java SE 9, a Oracle Corp adicionou quatro novos métodos úteis à interface java.util.Stream. Como Stream é uma interface, todos esses novos métodos implementados são métodos padrão. Dois deles são muito importantes: os métodos dropWhile e takeWhile. Se você estiver familiarizado com a linguagem Scala ou qualquer linguagem de programação funcional, certamente conhecerá esses métodos. Eles são muito úteis ao escrever código no estilo funcional. Vamos discutir aqui o método de utilidade takeWhile. Este takeWhile() recebe um predicado como argumento e retorna uma Stream do subconjunto dos valores fornecidos pela Stream até que o predicado retorne falso pela primeira vez. Se o primeiro valor não satisfizer esse predicado, ele simplesmente retorna uma Stream vazia.

jshell> Stream.of(1,2,3,4,5,6,7,8,9,10).takeWhile(i -> i < 5 )
                 .forEach(System.out::println);
1
2
3
4

Para saber mais sobre os métodos takeWhile e dropWhile, bem como outros novos métodos, consulte o meu tutorial original em: Java SE 9: Aprimoramentos na API de Streams

Aprimorado @Deprecated anotação

No Java SE 8 e em versões anteriores, a anotação @Deprecated é apenas uma interface de marcador sem métodos. É usada para marcar uma API Java que é uma classe, campo, método, interface, construtor, enumeração etc. No Java SE 9, a Oracle Corp aprimorou a anotação @Deprecated para fornecer mais informações sobre APIs obsoletas e também fornecer uma Ferramenta para analisar o uso estático de APIs obsoletas de uma aplicação. Eles adicionaram dois métodos a esta interface Deprecated: forRemoval e since para fornecer esta informação.

HTTP 2 Client

Em Java SE 9, a Oracle Corp vai lançar uma nova API de Cliente HTTP 2 para suportar o protocolo HTTP/2 e funcionalidades de WebSocket. Como a API de Cliente HTTP existente ou legada tem inúmeros problemas (como suportar o protocolo HTTP/1.1 e não suportar o protocolo HTTP/2 e WebSocket, funcionar apenas em modo de bloqueio e ter muitos problemas de desempenho), eles estão substituindo essa API HttpURLConnection pelo novo cliente HTTP. Eles vão introduzir uma nova API de Cliente HTTP 2 sob o pacote “java.net.http”. Ela suporta tanto os protocolos HTTP/1.1 quanto HTTP/2. Também suporta tanto Modo Síncrono (Bloqueante) quanto Modos Assíncronos. O modo Assíncrono é suportado usando a API WebSocket. Você pode ver essa nova API em https://download.java.net/java/jdk9/docs/api/java/net/http/package-summary.html Exemplo de Cliente HTTP 2

jshell> import java.net.http.*

jshell> import static java.net.http.HttpRequest.*

jshell> import static java.net.http.HttpResponse.*

jshell> URI uri = new URI("https://rams4java.blogspot.co.uk/2016/05/java-news.html")
uri ==> https://rams4java.blogspot.co.uk/2016/05/java-news.html

jshell> HttpResponse response = HttpRequest.create(uri).body(noBody()).GET().response()
response ==> java.net.http.HttpResponseImpl@79efed2d

jshell> System.out.println("Response was " + response.body(asString()))

Por favor, consulte meu tutorial original em: Java SE 9: Cliente HTTP 2 para entender o protocolo HTTP/2 & WebSocket, os benefícios da nova API e as desvantagens da API ANTIGA com alguns exemplos úteis.

API de Imagem de Multi-Resolução

Em Java SE 9, a Oracle Corp vai introduzir uma nova API de Imagem de Multi-Resolução. A interface importante nesta API é MultiResolutionImage. Ela está disponível no pacote java.awt.image. MultiResolutionImage encapsula um conjunto de imagens com diferentes Alturas e Larguras (ou seja, diferentes resoluções) e nos permite consultá-las de acordo com nossos requisitos.

Recursos Diversos do Java 9

Nesta seção, apenas vou listar alguns Recursos Novos do Java SE 9. NÃO estou dizendo que esses recursos são menos importantes. Eles também são importantes e úteis para entender muito bem com alguns exemplos úteis. Até agora, não obtive informações suficientes sobre esses recursos. É por isso que vou listá-los aqui para uma compreensão breve. Vou abordar esses recursos um por um e adicioná-los à seção acima com uma breve discussão e exemplo. E, finalmente, escrever um tutorial separado mais tarde.

  • Melhorias no Coletor de Lixo (Garbage Collector)
  • API de Caminhamento de Pilha
  • Filtrar Dados de Serialização de Entrada
  • Descontinuar a API de Applet
  • Concatenação de Strings Indify
  • Handles de Método Aprimorados
  • API e Serviço de Logging da Plataforma Java
  • Strings Compactas
  • API de Analisador para Nashorn
  • Pesquisa Javadoc
  • Javadoc HTML5

I will pickup these java 9 features one by one and update them with enough description and examples. That’s all about Java 9 features in brief with examples.

Source:
https://www.digitalocean.com/community/tutorials/java-9-features-with-examples