Os destaques do Java 8 em diante

Os destaques do Java 8 em diante
Brenda Souza, LUIS EZEQUIEL PUIG
Brenda Souza, LUIS EZEQUIEL PUIG

Compartilhe

Java é uma das linguagens de programação mais potentes. A linguagem retornou mais forte quando a Oracle lançou sua nova versão Java SE 8, em 18 de Março de 2014 com novidades importantes.

Destaques do Java 8 em diante

1. Expressão Lambda

A expressão lambda é uma função anônima (função sem nome) que ajuda a escrever o código em um certo estilo funcional. Considerando que os dados podem ser iterados, filtrados e extraídos, a expressão é muito útil, especialmente na biblioteca de recompilação.

Sintaxe

(Parâmetros) -> Expressão

Código:

(a,b) -> a + b //Isto nos devolve a soma de a+b

2. Stream API

Stream API oferece uma técnica para o processamento de dados de diferentes maneiras, como filtrado, extraído, transformado, com a ajuda do pacote java.util.stream. Uma das principais vantagens de Stream API é que não se altera sua fonte, isto é, se filtra um conjunto de dados, se cria um novo conjunto com os dados filtrados no lugar de modificar a fonte original. Stream API avalia o código somente quando é necessário e não o repete mais de uma vez.

Matricula-se na escola de Programação da Alura. Junte-se a uma comunidade de mais de 500 mil estudantes, acesse a todos os cursos em uma única assinatura, com novos lançamentos a cada semana e desafios práticos na plataforma. Clique e saiba mais!

3. Método forEach()

Java SE 8 oferece um novo método chamado forEach que se define na interface Iterable. O loop forEach() pode ser usado em uma classe de coleção que estende a interface Iterable. Como este método recebe apenas um parâmetro, uma expressão lambda também pode passar como parâmetro.

Código: Percorre cada idade (de uma lista de idade) e as imprime.

edad.forEach( edad -> (System.out.println(edad);));

4. Método predeterminado

Normalmente, os métodos não abstratos não podem ser adicionados a interfaces. Porém no caso de Java 8 podemos adicionar esses métodos nas interfaces. Os métodos são escritos com uma palavra chave predeterminada e são conhecidos como métodos predeterminados. Como são métodos não abstratos, também pode ser incluído o corpo do método na interface, por exemplo:

Código:

public interface Telefone{
    default void Som(){ 
        System.out.println("Olá Ana, como está o meu som?");
    }
}

5. Data Hora API

Em Java 8 é introduzido uma nova API de tempo e API de data onde as datas utilizadas estão em um método diferente em comparação a outras versões de Java. Algumas das classes seguintes são de hora e data as quais estão disponíveis em Java. Pacote de tempo:

  • Classe Jtime.LocalDate;
  • Classe LocalTime;
  • Classe LocalDateTime;
  • Classe MonthDay.

Código:

Clock cl = Clock.systemDefaultZone();

System.out.println(cl.getZone());

6. Referências de métodos

A referência de métodos é outra característica introduzida no Java 8 que se pode usar em métodos de interface funcional. De outra forma, pode-se dizer que são parte de um subconjunto de outra característica de Java, as expressões lambda. Isso porque se você usa uma expressão lambda, também pode utilizar uma referência de método.

Os métodos podem ser:

  • Referência ao construtor;
  • Referência ao método estático;
  • Referência a um método de instância.
Banner de divulgação da Imersão IA da Alura em colaboração com o Google. Mergulhe em Inteligência artificial com a Alura e o Google. Serão cinco aulas gratuitas para você aprender a usar IA na prática e desenvolver habilidades essenciais para o mercado de trabalho. Inscreva-se gratuitamente agora!

Diferenças entre Java 8 e Java 9

Java SE 8 é a nova versão de Java desenvolvida pela Oracle que oferece várias características novas. A expressão lambda é considerada a característica mais significativa entre elas.

Agora é o momento de falar sobre Java 9, a principal mudança em JDK 9 (Java Development Kit ou traduzido para português: Kit de Desenvolvimento Java) foi a introdução de um componente chamado 'o módulo': o projeto Jigsaw.

É um projeto que nos ajuda a reduzir o tamanho e complexidade, tanto das aplicações Java como do próprio runtime de Java JRE. Deste modo podemos utilizar somente o que precisamos em nossa aplicação e não a plataforma Java completa.

Também tivemos a implementação do método Factory que provém de um padrão de projeto com o mesmo nome. A ideia é que, pensando nas relações entre objetos, os métodos de interface são criados sem especificar suas classes concretas. Ao falar desta forma pode parecer estranho, porém essa implementação, quando pensamos no método .of() é usada frequentemente nos tipos de dados Enums em Java.

Ao finalizar Java 9, não podemos deixar de mencionar que a incorporação do fluxo reativo por meio do Flow API, uma classe chamada Flow no pacote Util de Java que busca melhorar o processamento assíncrono dos dados. Temos quatro classes que trabalham esse fluxo: Assinatura, Processador, Assinante e Publicador.

  • Classe Assinante trabalha com a origem das mensagens e demandas.
  • Classe Publicador trabalha com o processamento das demandas de forma assíncrona.
  • Classe Assinatura se encarrega da conexão entre as classes Assinante e Publicador ao gerenciar as mensagens de controle.
  • Classe Processador pode trabalhar tanto como a classe Assinante como a classe Publicador.

Uma vez mencionados os destaques desta versão, passemos para a versão Java 10.

Características de Java 10

1. Inferência de tipo variável local

Essa nova característica busca simplificar e melhorar a experiência do desenvolvedor. A nova sintaxe reduz o comprimento do código relacionado com Java, ao mesmo tempo que mantém o compromisso de segurança do tipo estático.

A inferência de tipo variável local introduz a palavra chave var, isto é, pode definir livremente as variáveis sem ter que especificar o tipo de variável, como por exemplo:

Iniciamos nesta variável:

list <String> list = new ArrayList <String> ();

Stream <String> stream = getStream();

E passamos a esta variável:

var list = new ArrayList <String> ();

var stream = getStream();

2. Interface do Coletor de Lixo

Na estrutura anterior de JDK, os componentes que formatam uma implementação do Coletor de Lixo (originalmente em inglês, Garbage Collector) estavam dispersos em várias partes do código base, ou seja modificado no Java 10.

Agora, é uma interface limpa dentro do código fonte de JVM permitindo que os coletores alternativos se integrem rápido e facilmente. Melhorando o isolamento do código fonte dos diferentes recolhedores de lixo.

Características de Java 11

1. Cliente HTTP

A meta com a nova característica API HttpClient é proporcionar uma maneira de padronizar e consumir uma API REST, usando padrões modernos com melhores práticas já aplicadas em bibliotecas de terceiros, mencionadas anteriormente.

Também possui suporte para conexões seguras, HTTP2, websockets e request assíncronas. Há 3 (três) conceitos nesta API:

  • HttpClient: Foca em criar a conexão e sua configuração. Proxies, Authenticators, executors pools, cookie manager, etc.
  • HttpRequest: É basicamente uma requisição a uma URI. Podemos indicar o timeout, headers, informar se a requisição é síncrona ou assíncrona.
  • HttpResponse: Objeto para manusear a resposta da requisição. Nele é possível ver o status code, body response, headers e mais.

2. Execução a partir do arquivo de código único

Para executar um programa Java é necessário primeiro compilá-lo para bytecode para posteriormente executá-lo. São necessárias duas etapas para facilitar a execução dos programas que consistem em um único ficheiro de código, somando a possibilidade de lançar um programa até o código fonte. Isso é útil para programas pequenos ou para os casos de estar aprendendo a linguagem.

E por último vamos repassar algumas características de Java 17 neste artigo.

Características de Java 17

  • Foi definido um padrão para o switch já muito usado em Java e outras linguagens com um foco em uma maior legibilidade e modelagem do código. Assim evita-se o uso repetido de condicionais IF/ELSE e o operador instanceOf. Este estilo é mais declarativo, podemos visualizar melhor como o exemplo:
static String formatacao (Object o){ 
    String formato = "desconhecido";  
    if(o instanceof Integer i){      
        formato = String.format("int %d", i);  
    }else if (o instanceof Long l){      
        formato = String.format("long %d", l);  
    }else if(o instanceof Double d){      
        formato = String.format("double %f" , d);  
    }else if(o instanceof String s){      
        if(s.length > 3){          
            formato = String.format("Cadeia Curta %s" + s);      
        }else{          
            formato = String.format("Cadeia Longa %s" + s);      
        }  
    }  
    return formato; 
}

Logo podemos proceder desta forma:

static String formatoSwitch (Object o){
  return switch (o) {
          case Integer i -> String.format("int %d" , i);
          case Long l -> String.format("long %d", l);
          case Double d -> String.format("double %f" , d);
          case String s && (s.length > 3) -> String.format("Cadeia Curta %s", s);
          case String s && (s.lenght > 10) -> String.format("Cadeia Longa %s", s);
          default -> o.toString();
  };
}
  • É eliminado o Applet API do Java, que gerava um arquivo binário que podia ser utilizado para ter telas web. Já havia sido definido como obsoleto no Java 9 porém somente agora no Java 11 foi oficialmente eliminado.
  • Além disso, melhorou a parte referente a geração de números aleatórios, introduzindo uma nova interface chamado RandomGenerator: uma API uniforme que pode gerar números para diferentes tipos numéricos.

Características de Java 18

O Java 18 foi lançado no início de 2022 e conta com atualizações não focadas diretamente no código Java, e sim na plataforma de desenvolvimento. Foi padronizado o conjunto de caracteres com o UTF-8 e inserido a anotação @Snippet para adicionar código fonte em documentações criadas para códigos/projetos na linguagem Java. Criando uma utilização com poucas linhas de código para gerar um simples servidor web para o programador.

Conclusão

Finalmente podemos retirar uma conclusão de toda essa informação que temos sobre as diferentes versões do nosso querido Java. Economizamos escrever código usando a sentença Switch em vez de escrever tantos IF/ELSE juntos, podemos escrever de forma funcional o código através das Lambda.

Temos o laço de repetição forEach, movimentamos de uma forma mais eficiente datas e horas com as novas APIs, já que não é obrigatório preceder o nome de uma variável com o tipo de dado. Mas usamos a palavra "var" a fim de consumir melhor a API Rest através do cliente HTTP.

Brenda Souza
Brenda Souza

Scuba Alura LATAM. Sou estudante de Tecnologia da Informação na Universidade Federal do Rio Grande do Norte, em Natal (Brasil). Eu me concentro nas linguagens Java e Python, com áreas de interesse como BackEnd, Data Science e Inteligência Artificial. Também sou desenvolvedora BackEnd.

LUIS EZEQUIEL PUIG
LUIS EZEQUIEL PUIG

Veja outros artigos sobre Programação