Slide 1

Slide 1 text

Java 9 to 17: O que vem por aí? Rodrigo Graciano rodrigograciano

Slide 2

Slide 2 text

Lançamentos do Java 2 * https://en.wikipedia.org/wiki/Java_version_history

Slide 3

Slide 3 text

● Professional with 10+ years ● Principal Software Engineer ● NYJavaSIG Leader ● graciano.dev ● Twitter: @rodrigograciano Rodrigo Graciano 3

Slide 4

Slide 4 text

Java 9 ao 11 4

Slide 5

Slide 5 text

Optional API ● or() 5

Slide 6

Slide 6 text

Optional API (Contd) ● stream() 6

Slide 7

Slide 7 text

Optional API (Contd) ● ifPresentOrElse() 7

Slide 8

Slide 8 text

Classe String ● isBlank() ● lines() ● strip() ● stripLeading() ● stripTrailing() ● repeat() 8

Slide 9

Slide 9 text

Stream API ● toUnmodifiableList() ● toUnmodifiableSet() ● toUnmodifiableMap() 9

Slide 10

Slide 10 text

Stream API (Contd) 10 ● takeWhile() ● dropWhile() ●

Slide 11

Slide 11 text

Stream API (Contd) 11 ● ofNullable()

Slide 12

Slide 12 text

Local Variable Type Inference - var ● var não é um tipo de variável ● Não é um atributo de classe ● Não tem relação com var/val from Scala/Kotlin ● Deve ser inicializado ● Não é uma palavra reservada Antes: String name = “Java”; Depois: var name = “Java”; 12

Slide 13

Slide 13 text

Local Variable Type Inference - var Antes: Map> citiesLivedIn = Map.of("Rodrigo", of("São Paulo", "Rio de Janeiro", "Porto Alegre", "Nova Jersey", "Nova York")); Depois: var citiesLivedIn = Map.of("Rodrigo", of("São Paulo", "Rio de Janeiro", "Porto Alegre", "Nova Jersey", "Nova York")); 13

Slide 14

Slide 14 text

Collections API - Immutable Factory Methods Before: List numbers = new ArrayList<>(); numbers.add(1); numbers.add(2); Set cities = new HashSet<>(); cities.add(“New York”); cities.add(“Boston”); Map numbersMap = new HashMap<>(); numbersMap.put(“One”,1); After: List numbers = List.of(1,2,3); Set cities = Set.of(“New York”, “Boston”); Map mapOfIntegers = Map.of(“One”,1,”Two”,2); 14

Slide 15

Slide 15 text

Collections API ● List.copyOf() ● Set.copyOf() ● Map.copyOf() 15

Slide 16

Slide 16 text

Collections API ● toArray (IntFunction generator) 16

Slide 17

Slide 17 text

Por que preferimos Immutable Collections ● Um objeto é considerado imutável se seu estado não pode mudar depois de ser construído ● Depois de criar uma instância de uma collection imutável, ela irá possuir os mesmos dados enquanto a collection existir ● São mais eficientes já que não precisam se preocupar com alteração dos dados ● Geralmente consumem menos memória que collections mutáveis 17

Slide 18

Slide 18 text

Modules - Java 9 ● Jigsaw ● Divide a JDK em partes - módulos ● Módulo principal é o java.base ● NÃO É MANDATÓRIO usar módulos ● Java 100% backward compatible Por que módulos? ● Configuração é confiável ● Forte encapsulamento ● Permite que a plataforma Java seja escalável ● Maior integridade da plataforma ● Melhoria de performance 18

Slide 19

Slide 19 text

Outras mudanças ● Remove os módulos Java EE e CORBA ● Interfaces pode ter métodos privados (estáticos e não estáticos) ● Melhorias a Optional, try-with resources, Streams e Javadoc (HTML 5) ● Reactive Streams API ● HTTP2 ● Flight Recorder ● JShell ● Single file source code programs 19

Slide 20

Slide 20 text

Preview and Final Features, LTS, Non-LTS. 20 ● Release cadency changed at Java 10 ● New Java release every 6 months ● LTS versions 8, 11, 17, 21 or 23 - discussions ongoing ● Oracle JDK, OpenJDK, Correto, AdoptOpenJDK, Zulu, and more

Slide 21

Slide 21 text

Java 12 to 17 21

Slide 22

Slide 22 text

Sealed Class ● Permite ao autor de uma classe ou interface ter o controle de qual código é responsável por implementá-lo ● Provém um modo mais declarativo do que modificadores de acesso para restringir o uso de uma superclasse ● Suporte para futuras implementações do pattern matching ao prover uma fundação para padrão de análises exaustivas ● Possibilidade de ter uma super classe ser largamente acessível mas não largamente extensível 22

Slide 23

Slide 23 text

Sealed Class 23

Slide 24

Slide 24 text

Records ● Records são data classes imutáveis que requerem apenas o tipo e nome das propriedades ● Records não podem usar "extends" a não ser ao implementar interfaces ● Records não são serializáveis por padrão ● java.lang.Class API foi modificada para suportar. Por exemplo, dado Class>, podemos verificar se é um Record ou não usando o novo método isRecord() ● Records geram getters públicos em que o nome é igual ao nome da propriedade (instead of getAge(), age()) 24

Slide 25

Slide 25 text

Records Antes: 25

Slide 26

Slide 26 text

Records Depois: 26

Slide 27

Slide 27 text

Pattern Matching ● Pattern matching involve testar quando um objeto tem uma dada estrutura, extraindo dados desse objeto. ● Você já pode fazer isso com Java, contudo pattern matching introduz melhorias que possibilitam extrair condicionalmente os dados de uma forma mais concisa e robusta. 27

Slide 28

Slide 28 text

Pattern Matching Antes: Depois: 28

Slide 29

Slide 29 text

Switch Expressions var result = switch (month) { case JANUARY, JUNE, JULY -> 3; case FEBRUARY, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER -> 1; case MARCH, MAY, APRIL, AUGUST -> { int monthLength = month.toString().length(); yield monthLength * 4; } default -> 0; }; 29

Slide 30

Slide 30 text

Stream API ● toList() - Retorna uma List não modificável 30

Slide 31

Slide 31 text

Null Pointer Exceptions Antes: list.get(0).getName().trim() Mas quem é nulo??? 31

Slide 32

Slide 32 text

Null Pointer Exceptions ● Mensagens mais claras de NullPointerException Depois: 32

Slide 33

Slide 33 text

Text Block Antes Depois 33

Slide 34

Slide 34 text

Resumo de mudanças ao Garbage Collection ● Concurrent Mark and Sweep (CMS) ● G1 (Garbage First Collector) ● Experimental JIT Compiler - Graal (AOT) ● Epsilon GC ● Z GC - Java 11 ● Shenandoah GC - Java 12 34

Slide 35

Slide 35 text

Outras mudanças ● OpenJDK migrado para o Github ● JFR Streaming ● Hidden Classes ● Vector API ● Strongly encapsulated JDK Internals ● Deprecate Security Manager for removal ● Enhanced Pseudo-Random Number Generators 35

Slide 36

Slide 36 text

What about Project Loom? Project Loom is to intended to explore, incubate and deliver Java VM features and APIs built on top of them for the purpose of supporting easy-to-use, high-throughput lightweight concurrency and new programming models on the Java platform. ● Virtual threads ● Not mapped to OS threads 36

Slide 37

Slide 37 text

Q&A 37 https://github.com/rodrigolgraciano/java-features