Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
April 26, 2022 11:06 pm GMT

Java 8 ao Java 18 em dez minutos

Vou apresentar as grandes melhorias de cada verso do Java, agora oferece suporte total para lambdas , programao funcional, digite inferncia via var, colees imutveis com construtores simples e mais performticos e string multi-linhas.... alm disso, existem novos recursos empolgantes, como classes de dados (record), switch 2.0 e sealed classes.

Java 8

Programao Funcional

No Java 8, programao funcional e lambdas foram adicionados como recursos de linguagem.
Os dois paradigmas principais de programao funcional esto valores imutveis e elevando funes para cidados de primeira classe.

Os dados passam por um pipeline de etapas de modificao, onde cada etapa pega alguma entrada e mapeia para uma nova sada, que podem ser usadas com Streams e Optional .

Streams

Para um programa de computador comum, geralmente voc precisa trabalhar com uma lista de valores e realizar uma determinada transformao em cada valor . Antes do Java 8, voc tinha que usar um for loop para essa transformao, mas a partir de agora, voc pode usar Streams da seguinte maneira:

Stream.of("Oi", "E ai")    .map(s -> s + " Sassine")    .forEach(System.out::println);> Oi Sassine> E ai Sassine

A funo map recebe como entrada um lambda, que ser aplicado a todos os elementos do fluxo.

Streams pode trabalhar em Lists, Sets e Maps (via transformao).
Graas ao Streams, voc pode se livrar de praticamente todos os loops em seu cdigo! top n ?

Depois vou escrever um post explicando melhor streams e editar aqui;

Optional

Outro problema comum em Java eram as excees de ponteiro nulo.
Portanto, Java introduziu Optional que envolve uma referncia que pode ou no ser nula. A aplicao de atualizaes a este opcional pode ser feita de maneira funcional:.

Optional.of(new Random().nextInt(10))    .filter(i -> i % 2 == 0)    .map(i -> "nmero  par: " + i)    .ifPresent(System.out::println);> nmero  par: 6

No trecho acima, criamos um nmero aleatrio, envolvemos dentro de um objeto opcional e, em seguida, imprimimos o nmero apenas se for par.

Depois vou escrever um post explicando melhor como utilizar o Optional e editar aqui;

Java 9

JShell

Finalmente, temos um REPL para Java, e seu nome JShell ! Em poucas palavras, JShell permite experimentar trechos de Java sem escrever e compilar uma classe Java completa. Em vez disso, voc pode executar um comando por vez e ver o resultado imediatamente. Aqui est um exemplo simples:

$ <JDK_HOME>/bin/jshell > System.out.println("Sassine.dev")> Sassine.dev

Pessoas familiarizadas com linguagens interpretadas como JavaScript ou Python tiveram o prazer de um REPL por muito tempo, mas at agora, esse recurso estava faltando em Java. JShell permite definir variveis , mas tambm entidades mais complexas, como funes multilinhas , classes e executar loops.

Alm disso, o JShell oferece suporte ao preenchimento automtico, o que til se voc no souber os mtodos exatos oferecidos por uma determinada classe Java

Fbrica para colees imutveis

A inicializao simples do Lists est faltando no Java h muito tempo, mas esses tempos acabaram agora. Anteriormente, voc tinha que fazer algo assim:

jshell> List<Integer> list = Arrays.asList(1, 2, 3, 4)list ==> [1, 2, 3, 4]# Isso agora  simplificado da seguinte forma:jshell> List<Integer> list = List.of(1, 2, 3, 4)list  ==> [1, 2, 3, 4]

Este of(...) mtodo sofisticado existe para List , Set e Map . Todos eles criam um objeto imutvel em apenas uma linha simples de cdigo.

Java 10

var

Java 10 introduziu a nova palavra-chave var que permite omitir o tipo de uma varivel.

var baos = new ByteArrayOutputStream();

Esse recurso ajuda a reduzir o cdigo clich e melhorar a legibilidade.
Porm, h algumas limitaes: voc s pode usar var dentro dos corpos dos mtodos, e o compilador inferir o tipo em tempo de compilao, ento tudo ainda est estaticamente tipado.

Java 11

Arquivo de fonte nica

Anteriormente, quando voc escrevia um programa Java simples consistindo em um arquivo, era necessrio primeiro compilar o arquivo com javac e depois execut-lo java.
No Java 11, voc pode executar as duas etapas com um comando.

Classe exemplo:

public class TesteCompile {  public static void main(String[] args) {    System.out.println("ol mundo");  }}

Executando a classe:

java ./TesteCompile.java> ol mundo

Para programas iniciais simples ou experimentos que consistem em apenas uma classe Java, esse recurso para iniciar arquivos de cdigo-fonte nico tornar sua vida mais fcil.

Java 12

Switch 2.0

Aqui est uma demonstrao rpida de como a expresso difere da antiga instruo switch.

A antiga instruo switch define o fluxo do programa:

jshell> var i = 2jshell> String s;jshell> switch(i) {   ...>     case 1: s = "um"; break;   ...>     case 2: s = "dois"; break;   ...>     case 3: s = "trs"; break;   ...>     default: s = "nmero desconhecido";   ...> }jshell> ss ==> "dois"

Agora a nova expresso switch retorna um valor:

jshell > var i = 2 ;jshell > var x = switch (i) {   ... >      case 1 ->  "um";   ... >      case 2 ->  "dois";   ... >      case 3 ->  "trs";   ... >      default -> "nmero desconhecido";   ... > } ;x ==>  "dois"

Para resumir, a instruo switch antiga para o fluxo do programa e a nova expresso switch resolve para um valor.

Observe que essa nova instruo switch uma espcie de funo de mapeamento : h uma entrada (no caso acima i) e h uma sada (aqui x). Na verdade, esse um recurso de correspondncia de padres que ajuda a tornar o Java mais compatvel com os princpios de programao funcional . Uma instruo switch semelhante est disponvel no Scala h algum tempo.

Algumas coisas a serem observadas:

  • Em vez de pontos duplos, usamos setas ->
  • No h necessidade de break
  • O caso padro pode ser omitido quando todos os casos possveis so considerados

Para habilitar este recurso com Java 12, use --enable-preview --source 12

Java 13

Strings multilinhas

Voc j teve que definir uma string longa de vrias linhas como JSON ou XML? At agora, voc provavelmente esmagaria tudo em uma linha e usaria caracteres de nova linha
, mas isso torna a String muito mais difcil de ler. A vem o Java 13 com strings de vrias linhas !

Se liga s !!

public class TesteCompile {   public static void main(String [] args) {    var s = """        {            "nome": "Sassine El-Asmar",            "idade": "23",            "stacks": ["backend", "frontend", "mobile"]        } """;    System.out.println(s);  }}

Agora, executamos o mtodo principal por meio de inicializao de arquivo nico:

java --enable-preview --source 13 TesteCompile.java{  "nome": "Sassine El-Asmar",  "idade": "23",  "stacks": ["backend", "frontend", "mobile"]}

A String resultante se estende por vrias linhas, as aspas "" so deixadas intactas e at as guias so preservadas!

Java 14

Classes de dados: record (Chega de lombok ?)

Agora existem classes de dados em Java! Essas classes so declaradas com a palavra-chave record e tm Getters automticos, um construtor e o mtodo equals () etc.
Voc pode se livrar de um grande pedao de cdigo clich!

jshell> record Pessoa(String nome, int idade) {}|  created record Pessoajshell> var x = new Employee("Sassine", 23);x ==> Pessoa[nome=Sassine, idade=23]jshell> x.name()$2 ==> "Sassine"

Scala tem um recurso semelhante com classes de caso e Kotlin com classes de dados . Em Java, muitos desenvolvedores usaram o Lombok at agora, que oferecia praticamente os recursos que agora inspiravam o records Java 14.
Mais detalhes podem ser encontrados neste artigo do Baeldung.

Instanceof j devolvendo o objeto tipado

Primeiro verificamos se s do tipo e String, em seguida, lanamos novamente para recuperar seu comprimento n?

No mais! agora, com o Java 14, o compilador inteligente o suficiente para inferir o tipo automaticamente aps a verificao de instncia :

Object obj = new String("Oi");if (obj instanceof String s) {  System.out.println("String length: " + s.length());}

Java 15

Classes seladas - sealed

Com a palavra-chave sealed , voc pode restringir quais classes podem estender uma determinada classe ou interface.

Aqui est um exemplo:

public sealed interface Fruit permits Apple, Pear {    String getName();}public final class Apple implements Fruit {    public String getName() { return "Apple"; }}public final class Pear implements Fruit {    public String getName() { return "Pear"; }}

Ento, como isso nos ajuda? Bem, agora voc sabe quantos Fruits so. Este realmente um passo importante na direo de correspondncia de padres totalmente suportada , onde voc pode tratar as classes como enums.

Esse sealed recurso combina perfeitamente com a nova switch expresso explicada anteriormente.

Java 16

Todos preview listados acima do java 14+ liberado definitivamente

Ou seja no precisa mais do enable-preview para os itens listados acima .

API Vector

A API de vetor fornece um mecanismo para os desenvolvedores tornarem explcito para o compilador que as operaes de vetor devem ser usadas. No entanto, isso torna o cdigo mais complicado. Primeiro, necessrio obter uma espcie de vetor.

static final VectorSpecies<Float> SPECIES = FloatVector.SPECIES_256;void vectorComputation(float[] a, float[] b, float[] c) {    for (int i = 0; i < a.length; i += SPECIES.length()) {        var m = SPECIES.indexInRange(i, a.length);        // FloatVector va, vb, vc;        var va = FloatVector.fromArray(SPECIES, a, i, m);        var vb = FloatVector.fromArray(SPECIES, b, i, m);        var vc = va.mul(va)           .add(vb.mul(vb))           .neg();        vc.intoArray(c, i, m);    }}

Java 17

Correspondncia de padres para switch (preview)

  • Expanda a expressividade e a aplicabilidade das expresses switch, permitindo que os padres apaream nos rtulos de maisculas e minsculas sem precisar de Instaceof.

  • Introduziu dois novos padres: padres protegidos e entre parnteses.

Implementao antes do JDK17:

public String getValue(Object o) {        String result = "";        if(o instanceof Integer i) {            result = "Integer %d".formatted(i);        } else if(o instanceof Double d) {            result = "Double %d".formatted(d);        } else if(o instanceof Long l) {            result = "Long %d".formatted(l);        } else if(o instanceof String s) {            result = "String %d".formatted(s);        }        return result;}

Vamos refatorar esse mtodo para a nova feature do JDK17:

public String getValue(Object o) {        return switch(o) {         case Integer i -> "Integer %d".formatted(i);        case Double d -> "Double %d".formatted(d);        case Long l -> "Long %d".formatted(l);        case String s -> "String %d".formatted(is);        default -> o.toString();        };}

D uma olhada e um exemplo utilizando os novos padres:

public void quantasPortasTem(Veiculo o) {        switch(o){         case Carro c && (c.getPortas == 2) ->         System.out.println(" um carro duas portas");        case Carro c && (c.getPortas == 4) ->        System.out.println(" um carro quatro portas");        default -> System.out.println("no  um carro.");        };}

Java 18

UTF-8 por padro

A codificao padro atual pode ser lida em tempo de execuo por meio Charset.defaultCharset()da propriedade do sistema "file.encoding". Desde o Java 17 , a propriedade do sistema "native.encoding" pode ser usada para ler a codificao, que antes do Java 18 seria a codificao padro se nenhuma for especificada:

Sendo assim o file.encoding poderia vir como UTF-8 em alguns sistemas, Cp1252 ou default.

Antes:

Default charset : US-ASCIIfile.encoding   : defaultnative.encoding : UTF-8

Agora

Default charset : UTF-8file.encoding   : UTF-8native.encoding : Cp1252

Agora no java 18 default no mais reconhecido e por padro "file.encoding" UTF-8

No Linux e MacOS tanto o java 17 e 18 j resultam em todas as opes como UTF-8

Snippets para Java API Doc

At agora, se quisssemos integrar trechos de cdigo de vrias linhas ao JavaDoc, tnhamos que fazer isso de maneira bastante complicada via <'pre> e algumas regrinhas que tinhamos que seguir.

Agora com a tag @ snippet conseguimos exibir o trecho do cdigo-fonte completo.

/** * Escrevendo um arquivo: * * {@snippet : * try (BufferedWriter writer = Files.newBufferedWriter(path)) { *   writer.write(text); * } * } */

Integrar trechos de outros arquivos

No FileWriter.java , marcaramos o cdigo da seguinte forma:

// @start region="writeFile"try (BufferedWriter writer = Files.newBufferedWriter(path)) {  writer.write(text);}// @end

e utilizamos a referencia dele assim:

/** * Escrevendo um arquivo: * * {@snippet file="FileWriter.java" region="writeFile"} */

fim

Bom, listei as principais funes novas que tivemos entre as verses 8 a 18
mas claro que existem muitas outras alm de depreciaes de lib;

Quiser saber mais acesse a documentao oficial da Oracle


Original Link: https://dev.to/sassineasmar/java-8-ao-java-18-em-dez-minutos-2fe7

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To