 Bom dia pessoal, é um prazer estar aqui em todo mundo aqui, em Rodrigo Valdes... Oh, tem dois Rodrigos também, Rodrigo Ramalho, Rodrigo Graciano. Nossas famílias, pais e mães, não eram muito criativos na nossa época, né? É um prazer estar aqui, e obrigado Helder pelo convite, é sempre um prazer estar aqui nos eventos da World Hatch, principalmente no Devination. E falando em português ainda pra mim é muito mais legal, porque eu acho que é importante a gente dividir esse conteúdo com todo mundo. E o que eu tô pra falar, vocês não dão os assuntos que eu mais gosto. Essa é uma palestra que eu sempre dou, e ela sempre parece igual, mas ela é diferente, porque o Java tá sempre evoluindo e o Java tá evoluindo muito rápido. Se você for pensar quando começou tudo que aconteceu da pandemia, a gente tava no Java 14 e agora a gente tá no Java 17, que é o próximo LTS do Java. Fala que a gente vai brigando de LTS, LTS, porque eu trabalho com muitos que estão financeiros, então eu via tudo o Java 11 e agora tá todo mundo virando a Java 17, que é o long-term support, onde você tem anos e anos de suporte por diversos vendas, inclusive da World Hatch, pra você ter o suporte. E é difícil de falar tudo que é um rápido, por isso que eu vou falar pra vocês o que eu acho mais legal que tá acontecendo no Java. Pra começar a aquecer os motores, eu sempre gosto de falar dessa JAP, que vem no Java 14, que é pra melhorar o new pointer exceptions. Isso aqui enche o saco de toda desenvolvedora Java, desenvolvedor Java, que era quando você tinha uma linha tipo A.i.99, se tomava no pointer exception, eu não sabia onde que tava no pointer e você precisava colocar um debug ali. No Java 14, eles melhoravam, melhoraram, e agora eles falam qual que é a variável, qual que é a referência que tá nula. Outra coisa que era pra evitar o bullying do pessoal de outras linguagens, que é o suporte que vem no Java 13, do Java Texts Blocks, que era, eu tinha que escrever, toda vez que a gente escrevia um SQL, eu tinha que ficar colocando esse monte de mais aí, quem usa ideia boa, sabe que as ideias ficaram muito boas em fingir que esse problema não existe, porque em Java tinha um Text Blocks, você usa igual a o IntelliJ, você dá um Ctrl C, Ctrl V, um texto, ele já coloca nessa identação, mas com Text Blocks do Java, a gente consegue escrever uma coisa mais bonita assim, colocando três aspas duplas em cima, você coloca seu bloco de texto, e três aspas duplas de baixo. Isso aqui é só pra a gente aquecer os motores do que o Java trouxe pra gente recentemente de, sim, é melhoria de sintaxe, né? E agora vamos falar mais as coisas importantes, e eu acho que é legal o que eu gosto de dar essa palestra, é pra você entender, tentar entender como que todas as coisas são relacionadas, que a gente, às vezes a gente vê uma feature ao beijo, no terminal do tipo, você não sabe, você não consegue ver a full picture, todo panorama de tudo o que está acontecendo no Java. Começou no Java 10, veio a inferência de tipos locais, que é o operador var. Se você for pensar bem, isso não é muito novo pra gente, que a gente já tinha isso no Java muito tempo, quando começou, quando a gente tinha sintaxe Diamond, que eu acho que isso era, que vem no Java 8 ou Java 9, que quando eu tinha uma lista de um tipo, quando eu estava no new, a realistia não precisava passar o tipo. Isso já melhorou muito o nosso código, principalmente pra quem trabalha com o meu bastante com o mapa, ficava aquela sintaxe toda ruim, e agora... E no Java 10, a gente teve isso que todo mundo já costumava, que eu espero que nesse ponto, pra todo mundo usando Java 11 já, que você tem a inferência de tipos de variável locais. Por exemplo, eu posso usar o var, eu posso usar o var dentro de for, e isso melhora muito pra mim, melhora muito a legibilidade, código, tornando a sintaxe do Java muito amigável, porque é o compilador fazendo mais trabalho pra mim. Isso funciona pra variável local, funciona dentro de índex de for loop, funciona entreit resources, não pode usar var em fields de classe, em parâmetro e retorno de método, porque o nosso compilador precisa saber exatamente os tipos no ponto class de antemão, mas a inferência de variável local funciona muito bem. E quando isso apareceu, muita gente começou a reclamar pra mim que isso ia acabar com a legibilidade dos códigos Java, usando esse exemplo desse tipo aqui, que você não consegue saber o que é a variável x. O problema é, não é na variável x, o problema é em nenhum no var, o problema é no y, que você não sabe o que é, porque você foi ajudar nesses exemplos que estou colocando aqui agora, se você usa objetos e métodos que são bem escritos, que falam o que eles estão acontecendo, você pode substituir o tipo da variável e o código fica muito mais legil, em vez de ter um map, longo estudo, em vez de você ter um var, em vez de você ter um objeto como add, você tem var e isso melhorou muito a legibilidade. E eu fiquei muito feliz quando isso já apareceu no Java. Agora, a coisa começou a melhorar quando começou a ter blocos de switch expressions. Isso veio, começou no Java 10 e virou feature complete no Java 14, que é eu, quando comecei a programar até por muito tempo, você pegar, procurar num foquil, as palestras gravadas que a gente tem interesse, tinha eu indo contra, falando que você não podia usar switch, porque era muito error-prone para bug. Se você esquecer um break, essa sintax aqui, já era, se você passar um num, já era, quando você está usando árvore de objetos, se você o queize para fazer coisas de objetos, é pior ainda, então eu sempre falava, porque essa sintax que vocês estão vendo aqui agora, ela veio muito do C. E era error-prone, era cheio de bugs. E daí, como deixar isso mais moderno? Começou que a gente começou a ter cases e do lado direito a gente passou a ter um expression block. Um expression block, que é parecido o que a gente usa no Lambda, o que o Lambda passa, você está usando um expression block, é muito importante eu perceber que a gente vai começar a usar, já está começando a usar no Java, switch como simulador de expressão. O que a gente está fazendo aqui, na verdade, é simular uma expressão e atribuir ela numa variável, que nesse caso é o número de letters, um exemplo simples que eu dou. E como que a gente deixa? Será que a gente está fazendo switch de expressão? O que o Java 14 trouxe para a gente? Eu posso usar o switch como um expression, e ele pode retornar diretamente o valor. Ao invés de estar passando uma variável e ter que alterar o valor da variável, como eu estou usando um bloco, eu posso usar o switch para retornar. Por exemplo, eu estou usando o switch como uma função do Java, e isso pode ser muito útil, principalmente quando a gente for entrar com um pattern matching. Um ponto importante, por ser qual que aquela palavra chave que eu tenho ali, que é o yield, na verdade eu estou fazendo retorno no valor. Quando eu só tenho um expression block, como eu tenho um lambda ali, o 6, o 7, o 8, aquilo pode ser um bloco maior de código, eu tenho um retorno, mas quando o cara torna diversos tipos de valor, eu uso yield. Isso vai ser muito importante mais para frente. Eles colocaram... quando eles colocaram isso no Java 14, eu estava com os amigos, que não são mais javeiros, na que abandonaram, já falaram que o Java está se preocupando com isso, mexendo no switch de bloco de expressão. Eu espero que hoje vocês entendam o pattern matching. No Java 14 para o Java 16, teve também uma feature muito importante nova do Java, que vai mudar o jeito, na minha opinião, já mudou o jeito que a gente usa Java, principalmente você que está do Java 11, e você vai para o Java 17, você pode começar a usar, que é os records. Eu já fui bem purista de programação dentro do objeto, e eu falava que quando eu dava aulas, e a gente se mudou aqui nos Estados Unidos, que eu namorava no Brasil, eu dava aulas universidades em matérias de orientação do objeto, eu sempre falava que se você está usando objetos anêmicos, você não pode ter um modelo anêmico de dados, você não pode ter uma classe só com getters, etc. Porque não é orientação do objeto e etc. Só que com o tempo tudo evolui e eu também evolui um pouco no meu pensamento sobre as coisas. Quando a gente pensa em orientação do objeto, a gente está pensando muito no monolito, e hoje o mundo está indo muito, isso que é um slide de uma outra palestra. Eu estou falando de micro front-end, que é um que eu sou, que o Elder fala nas palestras dele, quem deveria acompanhar o Instagram do Elder, que é bem legal, eu sou o deslugador pato, que eu tenho um pé no front-end, um pé no back-end e eu brinco sempre com o Elder. E essa palestra é meu de micro front-end por que? Porque tudo está mudando para sistema distribuído. Se você for ver em micro services, mudou um pouco da nossa jeito que a gente faz arquitetura de software. Uma coisa que o outro fala em palestras é que até o front-end nosso está sendo micro micro servicesado, vou falar sem inventar essa palavra agora, com esse micro front-end a gente está pensando tudo em arquitetura distribuídas e uma coisa de arquitetura distribuídas é que o você precisa passar dados de um lado para o outro. Então eu preciso ter um dado que ele precisa ser serializado ser passado pela rede e descererizado do outro lado. Seja em JSON, seja em XML, seja em qualquer tipo de formato e como que a gente faz isso no Java antes de ter o recorde. Por exemplo, isso aqui eu trabalho na Red Hat no Business Automation e uma das coisas que a gente faz é um motor de BPMN então tem uma coisa que a gente tem que ter um projeto que se chama Cogito que eu tenho que passar sistema distribuídos. Eu tenho um sistema distribuídos que eu estou passando tasks entre meu BPMN. Aqui eu tenho um task de exemplo, tenho um ID e um ontem de fields que o usuário definiu. Como que eu faço isso com Java? Eu quero ter esse objeto construído no Java. O primeiro passo que eu faço, como todo bom javeiro, eu uso a minha IDE e coloco o construtor. Eu gerei o construtor e a talha da minha IDE, que eu sou bem bom também em atalhas, criou esse construtor gigantesco aí. O próximo passo é vou pegar e vou criar o meu equals e meu hash code. Daí o código já ficou um pouquinho menor. O próximo passo é eu preciso gerar guetas etc para todo o negócio. Eu vou para a minha IDE e gera um negócio de 88 linhas. Então a gente tem 88 linhas só porque eu queria fazer um objeto para transportar no dados entre os temas distribuídos. Eu queria ter o meu objeto task e transformar eles para passar de um microservice que Java para o outro. As nossas ideias ficaram muito boas em esconder esse tipo de código. Se você for olhar, quando eu tenho o GetSet, o meu IntelliJ cumprinho o Visual Studio Code e ainda tenho um monte de outros frameworks que foram feitos no passado e Java tipo Lombok para resolver esse problema de uma maneira criativa, porque eu não preciso mais hoje. O que eu tenho que fazer? O que eu quero é criar aquele objeto de transporte que na minha época, para quem é um pouco mais antigo, tinha os DTOs no ZJB que a gente fazia, que era para transformar, mandar um objeto simples um pouco de um para o outro. E o perigo é os slides sim, vou lendo, os slides estão no meu site a gravação o editor pode responder depois os slides vai estar no edder.gn.me O perigo mora que quando eu tenho uma coisa muito grande desse jeito, eu já tive coisa que se gerou na IDE, só que você teve que colocar um pouquinho de código em algum método e esse código ficou escondido entre um monte de border plate. O que eu queria? Eu queria ter um objeto simples, uma task simples que eu tivesse que passar só para transportar, e é daí que vem o meu recorde. Para construir um recorde em Java, é tão difícil quanto mudar de class para recorde e eu já tenho o meu DTO feito automaticamente, eu já ganho fios desimutáveis, eu ganho executor e eu ganho a implementação de equals, hash code e de string automaticamente feito para mim pelo compilador, sem eu ter que fazer aquele monte de border plate e o mais importante, sem ficar escondendo os bugs lá no meio daquele monte de código border plate. Então, se eu tenho uso case que eu tenho um agregado de play data que eu estou pegando dados cruz para passar de um microservice para outro, pode ser, tem vários nomes daí. DTO tem o wrapper, tem transfer sempre que eu tenho esses patterns para fazer os microserviços javas que eu estou fazendo em Quarkus ou outros frameworks, para, você deveria estar usando Quarkus, para eles conversarem para passar o dado de um lado para o outro eu tenho um recorde que faz muito melhor essa conversa do que eu usar os meus pojos gerados. Então, a gente conseguiu com Java ter um desecoplamento total entre a classe de dados de status e a sua API porque eu tenho uma estrutura agora no Java que ela é capaz de fazer os meus DTOs automaticamente para mim pelo compilador que é um fit natural para toda vez que eu preciso fazer externalização de dados e tema distribuídos, serialização, marketing de JSON, XML ou pode fazer o mapping. O que eu posso colocar mais nesse recorde? Eu posso colocar novos construtores, até o canônico com uma lógica adicional, se eu quiser. Eu posso colocar static fields and methods. Eu posso fazer implementar interface e eu posso fazer as minhas anotações, por exemplo. Comparables. Eu posso colocar bin validation dentro do meu recorde então ele tem tudo o que eu precisaria para fazer um pojo para uma sintaxe muito mais importante. Mas o que o compilador do Java faz? Quando eu tenho um recorde como esse sample, o task ele gera por trás um ponto clese, esse aqui é um ponto clese descompilado pelo IntelJ, uma coisa de tipo. Então se você for olhar, todo field que eu coloquei no meu recorde ele está estendendo uma classe que chama recorde, ele está colocando private final em todos os meus feeds, então ele é um pojo entre aspas, feito para ser imutável, ele implementa hash code, ele implementa picos. Pedro, respondendo à sua pergunta, não é um boco que não morreu, porque é duro matar a tecnologia, principalmente no Java. A gente vai ter aquele sistema legado que ainda está usando um longbok, mas se você está usando Java, se você vai migrar, como todo mundo vai ter que migrar para o Java 17, a minha opinião é que não tem mais porque usar longbok em projetos novos. O recorde ele funciona melhor do que um longbok porque ele é feito pelo próprio compilador da linguagem e ele não tem muita mágica sendo feita para frente e ver logo mais uns 5 minutinhos onde o recorde pode se encaixar com pattern matching, que daí vai botar mais um pê na cal do longbok. Então a gente tem com ele, com recorde uma coisa muito legal para fazer o meu plane data que é o feed perfeito para o meu sistema distribuído, então sempre quando eu tenho que fazer, que cossar na sua IDE para você fazer aquele generate as gatters etc, toda vez que você fala a talha agora, você não pensa aqui deveria ser um recorde, se eu estou usando esse atalho, eu tenho que pensar duas vezes, eu tive que perder um pouco dessa memória muscular de como isso funciona. E se foi nossos records, outra coisa muito legal que veio agora no JDK 17, como feature mesmo, suportada, são assilio classes. Ela começou com um JPE 360, foi 497, foi 409 e no JDK 17 ela agora é uma feature da linguagem. O que que ela me permite? Ela permite ser lá classes interface dando mais controle para quem pode estender essa classe, criando um subtipo e criando hierarquia de classe mais segura. Criar uma hierarquia muito classe mais segura é muito importante que percebe que tudo é um pêndulo, né? Quando você estuda a lintação você aprende que você deve ter aquela hierarquia de classes, tudo extendes quando você vai para o mundo prático tem muitas pessoas que falam que herança é até um anti-pattern, porque ele está abrindo muito nas God of Codes, assim que usar mais composição no como que é o nome do livro? Java eu estou sem memória que fala que você tem que fazer foi o primeiro lugar que tem um monte de dicas em Java o livro teve a segunda edição agora, tem uma palestra do Edson inclusive sobre o livro eu esqueci o título agora mas o que ele fala que você tem que favorecer composição em vergerança, eu concordo com isso mas agora com silla de classes a gente pode ter mais, efetive Java já achou a bloca, muito obrigado Edson é inteligente, ou não o Edder desmemoriado ou o Edder desmemoriado ou com silla de classes eu posso ter mais com o controle de herança, então eu posso ter um pouco mais de uso de herança de Java eu concordo, sem ter silla de classes é muito melhor você favorecer herança favorecer composição ao invés de herança mas com silla de classes você volta a ter mais controle de quem é do nosso sistema todo mundo escreveu já um código desse jeito esse exemplo eu copiei um lugar muito legal para você ficar com a pergunta do dos atalhos, do Rodolfo Rodolfo, o lugar que eu gosto mais para aprender os atalhos de IDE tem um blog da JetBrains todo o release do Java eles fazem um resumo das features e mais como a IDE está suportando em atalhos esse exemplo eu copiei de lá, então é uma fonte legal para você aprender como IntelJ funciona acasicionado no Java, é o blog da JetBrains o negócio é eu escrevi um monte de código desse tipo e um monte de vezes na minha vida aonde você tem que esse código já um pouco, você vê que eu estou escondendo um instance offer dentro daqui, eu estou passando ainda um objeto plant para dentro dos meus métodos mas eu estou melhorando ele com Refactor isso é uma coisa que eu sempre escrevi esse tipo de código mas esse código é bem propenso a bugs, o que ele está fazendo ele está pegando um tipo um tipo pai e eu estou quebrando ele, eu estou desenvilopando todos os sub tipos dele, em teoria para fazer algum tipo de processamento diferente, então você tem um tipo pai e você está pegando pela definição do tipo o que você está fazendo nesse método é separando em um monte de brentes do teu código não brentes do Git, brentes do teu código mesmo, se for o Cucumber eu faço uma coisa, se for um Climber eu faço uma coisa, e se não for outras coisas eu dou um zero muito isso, é na minha época que fazer processamento bancário com tipos de ordens de pagamento com tipo de transação, porque tudo em banco tudo é uma ordens de pagamento, só que dependendo do tipo de ordem eu tinha um processamento diferente então eu tinha uma super classe ordem de pagamento, eu ia quebrando se era moeda estrangeira, se era de uma moeda estrangeira para outra, se era uma ordem de pagamento exterior você vai para seu, é um roteador de processamento quebra uma linha de código, um monte de brentes o qual que é o grande problema desse código? se alguma pessoa em algum dia um outro desenvolvedor que não conhece esse códigozinho que está escondido, ele cria uma nova, um novo sub-tipo de planta, e ele não sabe que esse código existe esse código vai quebrar, porque eu deveria ter implementado o processamento para um novo tipo de planta ou um novo tipo de ordem de pagamento e eu vou ter a brente no meu método de processamento tem um monte de jeito de resolver esse problema com design parts por exemplo, strategy, é um jeito de eu resolver esse tipo de coisa mas eu sempre acabava com esse código de else if e sempre quando você está trabalhando uma base de dados grande, a primeira coisa que você faz quando você vai ter que criar um sub-tipo você tem que saber que esse sub-tipo é importante e você vai procurar com a sua IDE todas as references daquele tipo para tentar achar códigos e desse pedacinho quando você está com o monolito funciona que é uma beleza sabe? porque você está com toda a base de código feito check out na tua máquina e tá beleza agora nesse mundo de microservices fazer o find reference na sua IDE ficou um pouco mais complicado então esse código ficou muito mais propenso a erro, você pensa que eu tenho um monte de microservices eu tenho um jar que é o meu libe de meu shared types, que é os tipos para colocar um tipo novo no microservice eu vou ter que lembrar que quem faz o processamento de pagamento vai ter que colocar essa brente no IFI, como que Ciled Classes me resolve esse problema eu consigo falar que uma interface ou um tipo abstrato ela é Cilid, que ela é acelada para só permitir extensão por determinados tipos e meus tipos aqui por exemplo são records, porque eu quero ser modernão na verdade é o que eu copio isso do exemplo do de app, que estão nos exemplos de código que são muito de idade que você pode explicar eu tenho um shape e se aquela interface shape, ela só pode ter o tipo círculo e herança só quem pode implementar shape é o círculo e herança e o retângulo se um novo tipo, se um novo recorde ou uma nova classe, implementar o shape e eu não colocar no meu Ciled interface vai me quebrar, vai me gerar um erro de compilação e isso é muito importante porque o designer meu da API ele tem mais controle de quem controla melhor a implementação por que mais tem mais controle eu não não deixo a minha abstração vazar, porque um grande problema é que você como desenvolvedor você quer que o seu tipo seja acessível para outros pacotes só que você não quer que a abstração vaze é por isso que no livro do block, ele fala pra você forçar composição e invés de herança por causa disso porque você não quer que a sua abstração vaze e com o Ciled Classes eu consigo ter mais controle sobre quem vai poder estender poder implementar o meu código e desacoplando a sensibilidade de volta aqui e principalmente o ponto mais importante é o meu compilador, ele pode inferir mais coisas porque o compilador consegue saber quais são todos os tipos os quais são todos os subtipos e vocês guardam a informação porque você vai ser mais importante mas antes de falar sobre isso como o compilador faz isso quando eu junto o Ciled Classes mais records que é jdk15 e jdk16 o Java começa a andar mais na direção de uma linguagem que vai suportar de teoria dos tipos se for pegar o pessoal moderno de Haskell e outras linguagens de ML, eles falam de teoria dos tipos e o pessoal do Java ficava fora do clubim porque eu não tinha muito suporte a SunTypes, a ProductTypes e nem a tipos recursivos no Java isso me reduzia o que eu conseguia falar de álgebra de tipos que é uma coisa muito importante não é muito importante é importante pro desenvolvedor para ver os benefícios mas é importante pro compilador dar mais recursos para a gente que que que é isso em razão em teoria quando a Ciled Classes do Java ela pode ser uma coisa que é chamada de SunTypes que é o somatório tipo que é um SunType são todas as variações de uma determinada estrutura de dados isso quer dizer que o conjunto de todos os tipos do ShapeS que é o tipo da minha interface é igual ao conjunto de todos os tipos Circle, mas todos os tipos retângulos isso é meio decoréva da aula de compiladores que se teve lá atrás mas é importante saber que com o Ciled Classes o compilador consegue saber quais são todos os tipos de uma interface ou de uma classe abstracta e isso vai ser muito importante mais para frente quem vai saber e o Record Types é o meu Product Types que é um é um jeito de eu ver para que que serve do que que é feito um determinado objeto uma determinada definição do objeto quais que são todos os componentes do seu objeto a gente vai ver o porquê que é importante também mais para frente com uma fítica 18 que eu vou mostrar lá no final da palestra então o compilador ele consegue saber, dado um determinado tipo agora com o Ciled Class quais são todos os sub tipos e ele consegue saber com Records Exato, Mateus e quais são os Records quais que são os componentes de um determinado uma tupla ou um struct que eu sei que o meu o meu que se chama Product Types é composto de um Point e ele é composto de outro Point que é o Lower Left e o Circle ele é composto de um Centro e ele é composto de um High então o compilador ele consegue inferir esse tipo de coisa só que quando você não vê o todo do que o Java está tentando fazer o que que o pessoal do JDK está tentando concluir com Java com o Wether de 2012 2013 por isso de orientação a objetos você vai falar que isso é um Godsmell você pode falar que isso está violando o encapsulamento do Java eu estou matando o encapsulamento do Java por que está matando o encapsulamento porque a minha interface Shape ela está sabendo todos os filhos que ela tem coisa que era uma coisa que a gente falava não, eu não quero fazer isso mas sempre aquilo que é você é uma pessoa desenvolvedora senior pra caramba quando perguntam pra você isso aqui você sempre fala, depende é a melhor resposta que você pode ter pra passar em qualquer entrevista e se você quiser por que que depende? dependendo do caso eu quero ter esse encapsulamento eu quero ser aberto pra extensão e fechado pra a mudança só que eu quero ter essa flexibilidade porque o benefício do encapsulamento não é muito bom eu já vou mostrar quando por que? isso aqui é do Brian Getz é um dos meus idros e ele é o arquiteto da plataforma Java que ele falou, a Scylla of Classes trabalhando junto com Records e o Pattern Matching vão suportar no Java uma nova forma de programação que é DataCentric que vai ser mais esse fixe e mais vai me levar essa inferência de tipos que a gente já vai ver por que? porque Scylla of Classes mais Records eles vão mudar uma coisa que daí começa a ficar muito legal no Java que é o Pattern Matching pro instance of o que é esse Pattern Matching pro instance of? por que? a gente já tava vendo que com todos os tipos como que eu consigo ter mais inferência agora o que está acontecendo eu quero chegar a um ponto onde eu faço mais mágica só antes de fazer mais mágicas eles fizeram uma pequena mudança em jdk16 que parece bobagem mas a gente vai entender que é, eu quero que o Pattern Matching também faça Type Matching que a gente sempre escreveu esse tipo de código aqui no Java e é muito legal ver como as coisas do Java agora são incrementais a primeira coisa que eles mexeram no instance of era se a gente estava vendo um objeto pai ali, às vezes é object sempre estava vendo esse cara, eu sempre pegava ah, se for num instance atal a primeira linha que eu faço é um Cast Return Shape isso aqui normalmente faz duas linhas eu como gosto de diminuir as linhas que eu acho feio aquele instance of no começo mas eu estou fazendo, eu estou primeiro testando e depois refazendo um instance of o que na partir do jdk16 eu tenho o escopo do meu flow uma vez que ele fez o Pattern Matching estou vendo a Shape Instance of R quer dizer, eu estou passando, eu sei já que o que está vindo no meu Shape é um retângulo ele está pegando o meu R e já fazendo uma atribuição com o Cast então o que está entrando na linha ali já do retorno já é o meu Cast Feito porque eu já fiz o teste do tipo então o Pattern Match do instance of, ele já está fazendo uma atribuição automática inclusive se você olhar o segundo LCIF a partir da primeira, primeiro Pattern Match por isso que chama Pattern Match in instance of a partir que eu fiz o primeiro Pattern Match a partir da frente daquela frente ali todo o escopo daquela daquele escopo daquele daquele bloco ele já está, então eu posso usar o R.GetRadius ele já está como tipo círculo isso já melhorou muito a minha legibilidade de código é sempre bom lembrar que o escopo o P só funciona dentro do escopo daquele Pattern Match então se eu estou, por exemplo, imagina que eu tenho esse código aqui que por favor, não escreva mas é só efeitos didáticos eu tenho, porque troca aquele variável P ali que você não vai ter aquele problema eu estou entrando um objeto homem, você vê que eu tenho na classe um ponto P ali, eu tenho um ponto P ali em cima quando eu estou fazendo if ou instance.P quando eu entro dentro daquele bloco daquele if, eu estou usando Pattern Match então o meu P que está ali dentro não é o P do Exemple 2 é o P que está entrando no object no segundo else o P já refere para o field então por favor, preste um pouco de atenção nessa variável mas você vai entender no Java que a gente vai começar a ficar mais orientada a escopo e isso é a beleza parece bem inspirada em TypeScript porque o TypeScript tem esse tipo de álgebra de tipos antes do Java mas é legal para mim que o Java está fornecendo isso para a gente agora e daí a gente olha no JDK17 no Pattern Matching for Switch que daí a coisa começa a ficar legal porque hoje o Switch para a gente eu só posso fazer Switch de algum determinado tipo só posso fazer Switch de tipos numéricos, estou copiando uma lista aqui não parece que eu decorei, tipo Enum e tipo String mas como a gente está o Pattern Match porque a gente usa também o Pattern Match no Switch por que? porque a gente escreve muito coisas desse tipo e esse código já melhorou porque você vê que a gente já está usando o instance off e eu estou fazendo if instance off já melhorou porque eu não tenho o cache que é código JDK17 eu estou com o instance, o Pattern Match a gente viu mas ainda assim eu estou tendo que fazer if tipo para fazer uma expressão if tipo para fazer uma expressão if tipo para fazer alguma coisa então eu voltei até o meu roteador por que eu tenho esse roteador? porque o meu Switch, se você for voltar lá atrás eu só tinha um determinado tipo, um tipo limitado de tipo padrão primitivo que o meu Switch permitia agora eu consigo fazer Pattern Match no Switch e para mim esse código já ficou muito bonito para ser bem sincero, voltando lá no roteador está falando no chat se eu pegar voltar lá do tempo que antes de ter genérico esse código aqui não parece Java esse código só entre os javeiros esse código parece TypeScript que é muito bom, parece linguagem moderna porque eu estou tendo um Switch que retorna numa expressão aí que está acontecendo já melhorou que eu tenho um Switch que retorna uma expressão e eu estou tendo também um Switch que retorna um Pattern Match então o objeto que está entrando ele consegue fazer Pattern Match e no case, se for um integer faz aquilo, se for um longo se for um doble faz aquilo esse código é muito bonito e ele é muito mais tipo, para você entender o que é lógico de negócio que está fazendo você pode ter um bloco, eu estou usando expressão só para ficar mais bonito mas em vez de ter um string.format você podia ter um bloco, claro só que se você pensa eu também acho o grande problema desse código aqui aquilo que eu falei para vocês até agora continua, a gente vai falar porque não vai dar esse problema se aparecer um tipo novo, imagina que eu estava vendo que ele quebrou, vai dar ruim e eu posso ter um monte de código aí que os bugs vão ficar escondidos quando eu vou nessa sintax nova do jdk17 com Pattern Match que é previo ainda, mas vai vim logo o código fica muito melhor fica muito muito mais legível do que eu estou realmente fazendo e Rodolfo, o mais legal disso que o Rodolfo falou que continua a melhorar a linguagem Java o mais bonito quando você vai valer o que está acontecendo na especificação é que eles têm uma preocupação muito grande com não quebrar o que vem para trás a primeira coisa no documento de requisito dos caras é que tem que continuar funcionando sim, Rodrigo, pode ser um recorde também no Pattern Match, a gente já vai chegar lá o importante, outra coisa muito que a gente sempre faz esse tipo de código é esse código aqui que eu estou falando da NoPonterexception porque eu estou olhando ali o default eu tenho o ponto de string do NoPonterexception o que a gente faz para se defender nesse tipo de caso é que eu tenho aquele padrão que se for todo o meu código tem isso que é um guard clause no primeiro para ver essa referência nulo eu faço outra coisa e não entro no código mas agora a gente também pode ter no como um Pattern Match de Switch, então eu posso ter um case se a referência for nula para fazer alguma coisa que vai ficar melhor muito ainda a minha semântica eu tenho um Pattern Match também para saber se o meu objeto que está entrando é nulo e daí fica mais legal ainda quando eu combino cilid classes olha o primeiro switch ali vocês estão vendo que eu tenho aquele case A no final que é a classe Pai, eu tenho uma classe A e eu tenho duas filhas por que eu tenho aquele case A e na verdade é o meu default porque eu preciso ter aquilo ali e o certo no mínimo é do child A o mais legal é quando eu estou usando cilid classes quando eu tenho essa álgebra de tipos o meu compilador, imagina que agora eu tenho uma cilid classes A e ela tem três filhos, a 1, a 2, a 3 eu não preciso na parte de baixo do meu default, por que? porque o compilador do Java consegue saber que eu tenho um case para cada filho por que ele consegue saber? porque o meu cilid classes ele limita os tipos que estão estendendo o meu cilid A o meu cilid A Pai está declarado que eu tenho um filho 1 o child 1, child 2 e child 3 e o compilador ele sabe que está todos os tipos ali lembra quando eu falei para vocês antes quando eu estava essa apresentação no TDC que eu falava, eu não tinha como muito bem explicar a importância da algebra de tipos aqui que entra o ponto na segunda switch porque o compilador consegue saber nesse switch expression todas as combinações possíveis de um tipo Pai para fazer o type matching que chama de algebra de tipos e outra graça muito legal se alguém criar um novo filho dessa minha cilid classes A ele vai ter que mexer lá na cilid classes A para colocar o child 4 assim que eu fazer colocar essa mudança na cilid class vai automaticamente quebrar o switch porque o meu compilador é capaz de saber porque tem um tipo novo no cilid que não está aqui então tudo ficou mais controlado com uma semântica muito mais clara e só para lembrar aqui de novo porque essa é a parte mais importante para esse que até o Rodrigo falou do escopo o escopo é muito importante no pattern match ou voltei isso aqui para vocês sempre lembrar que o escopo é muito importante o S só está no escopo do if mas não está no escopo do else então Java até volume indo muito e é muito legal agora você fala um pouco mais que não é de linguagem mas falar rapidamente uma coisa que eu não poderia falar não poderia deixar de falar o que está acontecendo no Java e isso vai vir no jdk18 para frente que é o project1 o que acontece com o project1 no Java rapidamente é que eu tenho eu tinha só threads no Java a thread do Java era uma piada com o sistema operacional que pegou no recurso e em que Java eu vou ter agora eu vou ter virtual threads que são threads virtuais é uma thread muito leve que basicamente tudo que a gente aprendeu que não era para ficar abrindo threads no Java num for loop você pode esquecer porque com virtual threads eu vou poder abrir quantas threads eu quiser eu posso abrir milhões de threads e como que eu faço esse bloco um thread.start virtual thread para abrir e isso é um assunto todo de uma palestra mas eu não podia deixar de falar nessas palestras de linguagem porque? porque ele vai trazer para a linguagem Java uma coisa que chama Strutter Concurrents que é um assunto todo de uma palestra mas é importante olhar para esse bloco aqui a gente primeiro aprendeu que não podia abrir thread em Java porque não estava mapeado em um sistema operacional então a gente não podia fazer um bloco igual esse onde cada microserviço abriu uma thread eu tinha que ter controle todo mundo falava não abre threads em for eu já derrubi um banco assim é uma história longa, um dia eu conto a história do maior bug mas eu vou ter concorrência triturada que esse é um pattern que tem no coupling que eu vou conseguir ter uma coisa que chama no Java que é concorrência triturada que eu consigo ver a programação acíncrona como um único bloco de código se você está pensando no TypeScript é mais ou menos uma referência quando eu tenho um await no TypeScript e no JavaScript eu consigo abrir um bloco e saber que todas essas threads, eu estou abrindo threads mas no final eu vou ter concorrência triturada de verdade porque eu tinha isso no executor mas eu não conseguia fazer isso isso é muito para essa palestra, só trouxe para lembrar e como que se aprende mais tem essas duas palestras falando do Project Long que eles falam muito melhor é o arquiteto e o Alan Bantman é um dos engenheiros a sístia das duas palestras são coisas muito importante para o Java porque a gente está aqui para falar de coisas de linguagem outra coisa muito legal que agora que a gente veio da algebra de types fica o que eu tenho, o Java consegue saber mais sobre os meus tipos eu finalmente vou ter TypeDiscontruct inArray inRecords lembra que a gente falou que eu tinha someTypes e eu consigo saber todos os tipos e uma vez que eu tenho um record eu consigo saber porque é travada entre aspas tudo que um record é composto a gente escreve só que já melhorou muito com Pattern Matching só que isso aí teve que todos são string porque a partir do jdk18 ou mais eu continuo tendo essa coisa que é meio ruim mas é meio ruim porque a gente melhorou muito mas na verdade eu estou passando um objeto e eu ainda vou ter que fazer int ou var não sei o que e fazendo a desconstrução do meu record que está vindo ali, eu tenho que passar para duas varadas para conseguir imprimir eu poderia fazer inline no meu sysout mas você pensa que num código maior eu não ia conseguir fazer inline eu preciso pegar o meu objeto que está entrando no InstaOff já melhorou muito porque ele já me dá como eu sei agora lembra do product types eu sei tudo, o compilador consegue eu não, o compilador consegue saber tudo que um record é composto porque ele gerou record eu consigo pegar e fazer desconstrução do meu objeto automaticamente então você pensa que eu estou pensando se o o foi numa instância do meu point eu já quero pegar os valores x y que estão dentro do point e desconstruir para varadas locais e imprimir, isso é a mesma coisa que eu tenho do array do JavaScript essa Rodriga era muito legal também no jugo do Rodrigo Cron que consigo fazer isso? você pensa que eu tenho uma coisa desse tipo onde eu tenho um record eu tenho um enum que é os meus tipos e eu estou pegando, você perceba bem que o meu record rectangle ele tem um ponto colorido lá dentro e tem um outro ponto colorido lá dentro e o ponto colorido ele tem um ponto p e tem um ponto c quando eu for eu consigo desconstruir o meu record que está entrando que eu estou falando, se esse objeto for retângulo eu quero pegar o color de point que está dentro e chamar ele de e o ponto que está dentro daquele primeiro parâmetro chamar ele de p e chamar ele de c e o segundo que eu chamar de lr e automaticamente no meu sysout eu estou pegando a cor que está dentro de um atributo de dentro do meu record porque lá no java 13 eles colocaram esse tipo de coisa e também para a gente correr um pouquinho aqui no final eu vou ter a mesma coisa para fazer desconstrução de vetor porque eu sei o que está entrando ali dentro eu consigo desconstruir um vetor que está entrando com o meu instante of que é muito legal e a última coisa para você expressar a retação que está acontecendo no mundo de java é o vector api isso aqui é você contar para seus coleginhas o API vai fazer para o meu java em um tweet é um projeto da intel com a oracle que eles estão pegando e melhorando o jeito que os vetores do java se relacionam com as instruções do processador porque o processador evoluiu para ser muito bom e fazer uma operação de vetor para que eu uso operação de vetor para fazer processamento de imagem para fazer coisa de machine learning para fazer multiplicação de vetor gigante esse gondip learning é uma solução do java junto com o lumb tem duas coisas do java que vão mudar uma é virtual thread e o outro é vector api vai abrir as portas por um monte de coisa de machine learning e está acabando meu tempo espero que vocês estão animados como eu que a linguagem java está evoluindo muito e alder, valeu de novo pelo convite é um prazer estar falando das coisas sempre é legal que eu dou essa mesma palestra desde o java 14 eu vou mostrando como as coisas estão se construindo eu acho muito legal porque o pessoal sabe o que está fazendo isso que é a mensagem principal fantástico, fantástico, obrigado mesmo galera, vocês têm pergunta para o alder a gente tem uns dois minutinhos aí se tiver estou pensando aqui se for que está fazendo desde o 14 né daqui a pouco precisa de uma hora para fazer vou, vou as coisas vão se conectando isso que é o mais legal e os slides pessoal vão estar nesse tal que isso aqui era o que terminar e sempre uma coisa que eu recomendo para todo mundo entra por exemplo, deixa eu pegar usar um minutinho só o mais alto se entra num release do jdk por exemplo e o 17 eu acho aqui as features tem uma pergunta para você aí do rodrigo comunidade com a depressão do excesso de informação ah rodolfo isso aí é é ah rodrigo também acho isso aí é um problema de TI o foco o que eu sempre falo até a coisa que olha até muito certo essa história do pato né que quando você foca em um monte de coisa você acabou não focando em nada porque tem uma explosão de informação em todo mundo o jeito que eu faço rodolfo eu escolho um Java é um que eu sempre acompanho que é perto de dia a dia e foco só nele só que sempre vai ter coisa mais e por exemplo essa vector API eu percebo bem sincero eu sei como a PI funciona mas eu não sei, eu não faço ideia de como isso é feito por exemplo projetil 1 eu estudei um tempo atrás para ver como isso está sendo implementado porque eu te interesse particular mas você tem que escolher e ignorar coisas de coisa de forma geral e essa é a graça de TI isso na minha opinião é você achar um assunto que você gosta igual o gosto de Java vai fazer você aprender e você tem que saber que se perguntar para qualquer pessoa que está aqui, qualquer um de nós que está aqui, vai saber mais que todo mundo sobre alguma determinada coisa e vai saber menos, todos outras coisas e vai saber menos com os outros e eu acho que isso é a parte da TI e aceitar isso é o fato da nossa carreira sempre que você escolhe algo, você está abrindo um monte de outras coisas e fica bem com isso ficar ok com isso beleza galera obrigado muito bom, como sempre bom te ver de novo obrigado pelo convite