Java 9 é uma versão importante e trouxe muitos recursos para os desenvolvedores. Neste artigo, vamos analisar 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 incluem;
- Java 9 REPL (JShell)
- Métodos de fábrica para List, Set, Map e Map.Entry imutáveis
- Métodos privados em interfaces
- Sistema de Módulos do Java 9
- Melhorias na API de Processos
- Melhoria no Try With Resources
- Melhorias na API CompletableFuture
- Fluxos Reativos
- Operador Diamond para Classe Anônima Interna
- Melhorias na Classe Optional
- Melhorias na API de Streams
- Anotação @Deprecated aprimorada
- Cliente HTTP 2
- API de Imagem de Multi-Resolução
- Recursos Diversos do Java 9
A Oracle Corporation está planejando lançar o Java SE 9 por volta do final de março de 2017. Neste post, 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 representa o Java Shell e também é conhecida como REPL (Read Evaluate Print Loop). É usada para executar e testar qualquer construção Java, como classe, interface, enumeração, objeto, declarações etc., muito facilmente. 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, consulte Noções Básicas do Java 9 REPL (Parte 1) e Recursos do Java 9 REPL (Parte 2).
Métodos de Fábrica para Listas, Conjuntos, Mapas e Entradas de Mapa Imutáveis
A Oracle Corp introduziu alguns métodos de fábrica convenientes para criar objetos de Listas, Conjuntos, Mapas e Entradas de Mapa 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 os 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 verbose. Para superar essas limitações, a Oracle Corp adicionou alguns métodos de utilidade às interfaces List, Set e Map. As interfaces List e Set têm métodos “of()” para criar objetos de Lista ou Conjunto Imutáveis vazios ou não vazios, conforme 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 de Mapa Imutável e um objeto de 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 de Fábrica do Java 9 para Listas Imutáveis
- Métodos de Fábrica do Java 9 para Conjuntos Imutáveis
- Métodos de Fábrica do Java 9 para Mapas Imutáveis e Map.Entry
Métodos Privados em Interfaces
No Java 8, podemos fornecer implementação de método em Interfaces usando métodos Default e Estáticos. No entanto, não podemos criar métodos privados em Interfaces. Para evitar código redundante e aumentar a 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 também 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ê quiser ler mais sobre esse novo recurso, por favor, acesse este link: Métodos Privados do Java 9 em Interfaces.
Sistema de Módulos Java 9
Uma das grandes mudanças no Java 9 é o Sistema de Módulos. A Oracle Corp vai introduzir as seguintes características 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. Essa arquitetura tem muitas limitações e desvantagens. Para evitar todas essas limitações, o Java SE 9 está chegando com o Sistema de Módulos. O JDK 9 vem com 92 módulos (podem mudar na versão final). Podemos usar os 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 possui um nome, código relacionado e outros recursos. Para obter mais detalhes sobre essa nova arquitetura e ter uma experiência prática, por favor, confira meus tutoriais originais aqui:
- Noções Básicas do Sistema de Módulos Java 9
- Exemplos de Módulos Java 9 usando prompt de comando
- Exemplo de Módulo Hello World do Java 9 usando o Eclipse IDE
Melhorias na API de Processo
O Java SE 9 está chegando com 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:
- java.lang.ProcessHandle
- java.lang.ProcessHandle.Info
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ções: Try-With-Resources para gerenciar recursos automaticamente. O principal objetivo desta nova instrução é “Gerenciamento Automático de Recursos Aprimorado”. O Java SE 9 vai fornecer algumas melhorias nesta instrução para evitar alguma verbosidade adicional e melhorar a legibilidade. Exemplo do 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 do 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 este novo recurso, por favor, siga o meu tutorial original em: Melhorias no Java 9 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 timeouts, 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 ao executor padrão após o atraso especificado.
Streams Reativos
Atualmente, a Programação Reativa se tornou muito popular no desenvolvimento de aplicações para obter alguns benefícios interessantes. Frameworks como Scala, Play, Akka, etc., já integraram Streams Reativos e estão obtendo muitos benefícios. A Oracle Corps também está introduzindo uma nova API de Streams Reativos no Java SE 9. A API de Streams Reativos do Java SE 9 é um Framework de Publicação/Assinatura para implementar facilmente aplicações Assíncronas, Escaláveis e Paralelas usando a linguagem Java. O Java SE 9 introduziu a seguinte API para desenvolver Streams 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 Reactive Streams.
Operador de Diamante para Classe Interna Anônima
Nós sabemos, o Java SE 7 introduziu uma nova funcionalidade: o Operador de Diamante para evitar código redundante e verboso, para melhorar a legibilidade. No entanto, no Java SE 8, a Oracle Corp (Desenvolvedora da Biblioteca Java) descobriu algumas limitações no uso do operador de diamante com Classe Interna Anônima. Eles corrigiram esses problemas e vão lançá-los 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 Opcional
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, conforme 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 com este resultado de forma preguiçosa no código resultante. Para entender mais sobre este recurso com mais exemplos e para ler mais 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 na escrita de 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 da Stream fornecida até que o predicado retorne falso pela primeira vez. Se o primeiro valor não satisfizer o 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: Melhorias na API Stream
Aprimorado @Deprecated anotação
No Java SE 8 e versões anteriores, a anotação @Deprecated é apenas uma interface de marcação sem métodos. É usada para marcar uma API Java que é uma classe, campo, método, interface, construtor, enum, etc. No Java SE 9, a Oracle Corp aprimorou a anotação @Deprecated para fornecer mais informações sobre a API obsoleta e também fornecer uma Ferramenta para analisar o uso estático de APIs obsoletas em um aplicativo. Eles adicionaram dois métodos a esta interface Deprecated: forRemoval e since para fornecer esta informação.
HTTP 2 Client
No Java SE 9, a Oracle Corp está prestes a lançar a Nova API do Cliente HTTP 2 para suportar o protocolo HTTP/2 e recursos de WebSocket. Como a API de Cliente HTTP existente ou Legado apresenta inúmeros problemas (como suportar o protocolo HTTP/1.1 e não suportar HTTP/2 e WebSocket, funcionar apenas no modo Bloqueante e muitos problemas de desempenho), eles estão substituindo essa API HttpURLConnection por um novo cliente HTTP. Eles vão introduzir uma nova API do Cliente HTTP 2 sob o pacote “java.net.http”. Ela suporta tanto os protocolos HTTP/1.1 quanto HTTP/2. Suporta tanto Modos Síncronos (Modo Bloqueante) quanto Assíncronos. Suporta o Modo Assíncrono usando a API WebSocket. Podemos 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, benefícios da nova API e desvantagens da ANTIGA API com alguns exemplos úteis.
API de Imagem Multi-Resolução
No Java SE 9, a Oracle Corp está prestes a introduzir uma nova API de Imagem 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 alturas e larguras diferentes (ou seja, resoluções diferentes) e nos permite consultá-las conforme nossos requisitos.
Recursos Diversos do Java 9
Nesta seção, apenas listarei alguns recursos diversos do Java SE 9. Não estou dizendo que esses recursos são menos importantes. Eles também são importantes e úteis para entendê-los muito bem com alguns exemplos úteis. Até agora, não obtive informações suficientes sobre esses recursos. Por isso, 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 posteriormente.
- Melhorias no GC (Coletor de Lixo)
- API de Stack-Walking
- Filtrar Dados de Serialização de Entrada
- Descontinuar a API de Applet
- Indificar Concatenação de Strings
- Manipuladores de Método Aprimorados
- API e Serviço de Logging da Plataforma Java
- Strings Compactas
- API de Parser para Nashorn
- Busca 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