<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Carolina Dias Fonseca</title>
    <description>The latest articles on DEV Community by Carolina Dias Fonseca (@diariodeumacdf).</description>
    <link>https://dev.to/diariodeumacdf</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F404882%2F61e4a5ba-da10-49c5-8cdf-0a0557103ba1.jpeg</url>
      <title>DEV Community: Carolina Dias Fonseca</title>
      <link>https://dev.to/diariodeumacdf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/diariodeumacdf"/>
    <language>en</language>
    <item>
      <title>Boas práticas ao usar Lambda e classe anônima em Java</title>
      <dc:creator>Carolina Dias Fonseca</dc:creator>
      <pubDate>Thu, 24 Feb 2022 18:58:54 +0000</pubDate>
      <link>https://dev.to/diariodeumacdf/boas-praticas-ao-usar-lambda-e-classe-anonima-em-java-2ko9</link>
      <guid>https://dev.to/diariodeumacdf/boas-praticas-ao-usar-lambda-e-classe-anonima-em-java-2ko9</guid>
      <description>&lt;p&gt;Já faz algum tempo que venho falando sobre classes locais, classes anônimas e expressões lambdas. O que são, como usar e quando usar. No atual post vou escrever sobre boas práticas ao usar lambda em Java. &lt;/p&gt;

&lt;h2&gt;
  
  
  Devo usar tudo o que a linguagem tem?
&lt;/h2&gt;

&lt;p&gt;Acho relevante colocar aqui que apesar do Java ter muitos recursos que podem e realmente ajudam no dia a dia de uma pessoa desenvolvedora, não quer dizer exatamente que esses recursos ajudem a manter um controle e facilidade de leitura/alteração no momento da manutenção do código.&lt;/p&gt;

&lt;p&gt;Portanto, quando falamos em “boas práticas” é focado no momento em que a aplicação foi para produção e, dali pra frente, teremos as manutenções, revisões, novas releases e etc. Do meu ponto de vista, sempre temos que pensar que a manutenção não necessariamente será realizada por outra pessoa, mas sim que pode ser qualquer pessoa, incluindo quem criou a aplicação, portanto, é importante pensarmos: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Qual a melhor forma de deixar esse código simples não só para alterações, mas de leitura e entendimento futuro?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Claro que não podemos da performance, segurança, arquitetura e etc, mas sempre mantendo em mente a questão de carga cognitiva de compreensão do código. Afinal, ninguém quer passar uma semana só para tentar entender  o que se passa diante dos seus olhos ali na IDE ou então ficar debugando linha a linha para tentar entender o que aquele trecho de código faz ou deixa de fazer.&lt;/p&gt;

&lt;p&gt;Vai por mim, já tive que fazer isso porque dei de cara com uma aplicação sem o mínimo de documentação e muito menos com código legível e compreensível. Só para dar uma noção, conseguimos achar um dos responsáveis pela a aplicação e nem ele sabia explicar o que ele e/ou o time tinham feito, então... acho que deu para entender, né?&lt;/p&gt;

&lt;h2&gt;
  
  
  E como faz?
&lt;/h2&gt;

&lt;p&gt;Pensando nisso, tenho lido muito sobre design pattern (ou, em português, padrões de projeto) tanto da Gang of Four - GoF (ou, em português, Gangue dos Quatro), como o SOLID e, o mais recente nas minhas leituras, o Effective Java (Java Efetivo) do Joshua Bloch.&lt;/p&gt;

&lt;p&gt;Esse último, até onde encontrei, está em sua 3ª edição e fala das melhores práticas em Java, usando o Java 9. Questionei no Twitter sobre a relação versão atual do Java (estamos na 18) versus a edição desse livro e a galera mais sênior em relação a mim, super recomendaram a leitura e adicionaram que, para o universo Java, é um dos livros que mais ajudam a entender como otimizar o código, simplificá-lo, além de dar uma visão mais ampla do próprio Java.&lt;/p&gt;

&lt;p&gt;Dessa forma, o que Bloch fala sobre Lambdas é, basicamente o seguinte:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Use expressão lambda ao inveś de classe anônima&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Agora vamos ao porquê: Classe anônima é mais verbosa, ao passo que a expressão lambda é semelhante a função dentro da classe anônima, porém bem mais concisa.&lt;/p&gt;

&lt;p&gt;Veja abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;//Exemplo usando classe anônima&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nc"&gt;Collections&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sort&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;palavras&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Comparator&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;2&lt;/span&gt;    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;compare&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;palavra1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;palavra2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;3&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;compare&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;palavra1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;palavra2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="mi"&gt;4&lt;/span&gt;    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;//Exemplo usando expressão lambda&lt;/span&gt;
&lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="nc"&gt;Collections&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sort&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;palavras&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;palavra1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;palavra2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;compare&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;palavra1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;palavra2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;()));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Na expressão lambda e em grande maioria das vezes, o compilador será capaz de deduzir os tipos especificados na linha 2 da classe anônima por um processo chamado por inteferência de tipo, portanto, podemos reduzir ainda mais o exemplo de expressão lambda:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;//Exemplo usando classe anônima&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nc"&gt;Collections&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sort&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;palavras&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Comparator&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;2&lt;/span&gt;    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;compare&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;palavra1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;palavra2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;3&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;compare&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;palavra1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;palavra2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="mi"&gt;4&lt;/span&gt;    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;//Exemplo 1 usando expressão lambda&lt;/span&gt;
&lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="nc"&gt;Collections&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sort&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;palavras&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;palavra1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;palavra2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;compare&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;palavra1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;palavra2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;()));&lt;/span&gt;

&lt;span class="c1"&gt;//Exemplo 2 usando expressão lambda em sua versão mais concisa&lt;/span&gt;
&lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="n"&gt;palavras&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sort&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;comparingInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;String:&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Outra dica muito importante que o Bloch passa ainda sobre essa questão de lambdas é de sempre que possível priorizar o uso de métodos genéricos, pois assim diminuirá as chances do compilador dar erro por inferência de tipo.&lt;/p&gt;

&lt;p&gt;Por exemplo, as enums facilitam muito o uso interfaces funcionais e lambdas exatamente pelo conceito de métodos mais genéricos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;//Exemplo de uso com Enum sem interface funcional&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;enum&lt;/span&gt; &lt;span class="nc"&gt;Operacao&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;2&lt;/span&gt;   &lt;span class="no"&gt;SOMA&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"+"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;3&lt;/span&gt;       &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="mi"&gt;4&lt;/span&gt;   &lt;span class="o"&gt;},&lt;/span&gt;
&lt;span class="mi"&gt;5&lt;/span&gt;   &lt;span class="no"&gt;SUBTRACAO&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"-"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;6&lt;/span&gt;       &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="mi"&gt;7&lt;/span&gt;   &lt;span class="o"&gt;},&lt;/span&gt;
&lt;span class="mi"&gt;8&lt;/span&gt;   &lt;span class="no"&gt;MULTIPLICACAO&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"*"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;9&lt;/span&gt;       &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="mi"&gt;10&lt;/span&gt;  &lt;span class="o"&gt;},&lt;/span&gt;
&lt;span class="mi"&gt;11&lt;/span&gt;  &lt;span class="no"&gt;DIVISAO&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;12&lt;/span&gt;      &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="mi"&gt;13&lt;/span&gt;  &lt;span class="o"&gt;};&lt;/span&gt;

&lt;span class="mi"&gt;14&lt;/span&gt;  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;simbolo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;//Construtor da enum&lt;/span&gt;
&lt;span class="mi"&gt;15&lt;/span&gt; &lt;span class="nc"&gt;Operacao&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;simbolo&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; 
&lt;span class="mi"&gt;16&lt;/span&gt;  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;simbolo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;simbolo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; 
&lt;span class="mi"&gt;17&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;//Pelas boas práticas de Bloch, sempre dar o override no toString&lt;/span&gt;
&lt;span class="mi"&gt;18&lt;/span&gt; &lt;span class="nd"&gt;@Override&lt;/span&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; 
&lt;span class="mi"&gt;19&lt;/span&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;simbolo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; 
&lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;//método abstrato para cada implementação&lt;/span&gt;
&lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;abstract&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="mi"&gt;22&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do jeito que o código está acima, para cada constante será dado um override no método &lt;code&gt;apply&lt;/code&gt; afinal, cada operação precisa de uma ação diferente para o mesmo método.&lt;/p&gt;

&lt;p&gt;Agora veja como isso fica mais conciso, ou seja, reduzido e simples ao usarmos lambda:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;enum&lt;/span&gt; &lt;span class="nc"&gt;Operacao&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;2&lt;/span&gt;   &lt;span class="no"&gt;SOMA&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"+"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
&lt;span class="mi"&gt;3&lt;/span&gt;   &lt;span class="no"&gt;SUBTRACAO&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"-"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
&lt;span class="mi"&gt;4&lt;/span&gt;   &lt;span class="no"&gt;MULTIPLICACAO&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"*"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
&lt;span class="mi"&gt;5&lt;/span&gt;   &lt;span class="no"&gt;DIVISAO&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;simbolo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;DoubleBinaryOperator&lt;/span&gt; &lt;span class="n"&gt;operacao&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;//construtor da enum&lt;/span&gt;
&lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="nc"&gt;Operation&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;simbolo&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;DoubleBinaryOperator&lt;/span&gt; &lt;span class="n"&gt;operacao&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;9&lt;/span&gt;       &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;simbolo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;simbolo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="mi"&gt;10&lt;/span&gt;      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;operacao&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;operacao&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="mi"&gt;11&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="mi"&gt;12&lt;/span&gt; &lt;span class="nd"&gt;@Override&lt;/span&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; 
&lt;span class="mi"&gt;13&lt;/span&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;simbolo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; 
&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="cm"&gt;/**o que antes era um método abstrato se torna um método concreto e 
* passamos a utilizar a interface funcional DoubleBinaryOperator cuja a ação é
* receber dois dados e receber um.
*/&lt;/span&gt;
&lt;span class="mi"&gt;15&lt;/span&gt;  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;16&lt;/span&gt;      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;operacao&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;applyAsDouble&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="mi"&gt;17&lt;/span&gt;  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="mi"&gt;18&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Então vamos esquecer as classes abstrastas e classes anônimas?
&lt;/h2&gt;

&lt;p&gt;Admito que o uso de classe abstrata ainda é algo um pouco confuso para mim se você for pensando em SOLID, por exemplo e até mesmo no próprio Java Efetivo, porém, gosto do ponto que o Bloch trás em seu livro quando diz o seguinte:&lt;/p&gt;

&lt;p&gt;“[...] Lambdas are limited to functional interfaces. If you want to create an instance of an abstract class, you can do it with an anonymous class, but not a lambda. Similarly, you can use anonymous classes to create instances of interfaces with multiple abstract methods.”&lt;/p&gt;

&lt;p&gt;Que, em tradução livre, nas mais é do que o uso de lambdas se restrigem ao uso de interfaces funcionais (algo que a própria &lt;a href="https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html#approach6"&gt;documentação do Java&lt;/a&gt; reforça) e diz que a classe abstrata você utiliza numa classe anônima e NÃO em um lambda. Da mesma forma que você utiliza a classe anônima para criar instâncias de interfaces com múltiplos métodos.&lt;/p&gt;

&lt;p&gt;Fontes: &lt;a href="https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html#approach6"&gt;Documentação Java&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.amazon.com.br/Effective-Java-3rd-Joshua-Bloch/dp/0134685997/ref=asc_df_0134685997/?tag=googleshopp00-20&amp;amp;linkCode=df0&amp;amp;hvadid=379735814613&amp;amp;hvpos=&amp;amp;hvnetw=g&amp;amp;hvrand=18280191810329920088&amp;amp;hvpone=&amp;amp;hvptwo=&amp;amp;hvqmt=&amp;amp;hvdev=c&amp;amp;hvdvcmdl=&amp;amp;hvlocint=&amp;amp;hvlocphy=1001773&amp;amp;hvtargid=pla-361252606493&amp;amp;psc=1"&gt;Effective Java - Joshua Bloch&lt;/a&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>braziliandevs</category>
      <category>tutorial</category>
      <category>programming</category>
    </item>
    <item>
      <title>Quando usar Classes aninhadas, classes locais, classes anônimas e expressões lambdas</title>
      <dc:creator>Carolina Dias Fonseca</dc:creator>
      <pubDate>Wed, 09 Feb 2022 22:35:46 +0000</pubDate>
      <link>https://dev.to/diariodeumacdf/quando-usar-classes-aninhadas-classes-locais-classes-anonimas-e-expressoes-lambdas-1c57</link>
      <guid>https://dev.to/diariodeumacdf/quando-usar-classes-aninhadas-classes-locais-classes-anonimas-e-expressoes-lambdas-1c57</guid>
      <description>&lt;h2&gt;
  
  
  Classe aninhada
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;Java&lt;/strong&gt; te permite definir uma classe dentro de outra. Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ClasseExterna&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
    &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ClasseAninhada&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="o"&gt;...&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Classes aninhadas te permitem ter lógica de grupo de classes que vocês está utilizando em um único lugar, o ponto positivo é que esse tipo de recurso aumento o encapsulamento, cria um código mais legível e melhora a manutenção do código.&lt;/p&gt;

&lt;p&gt;Já as classes locais, classes anônimas e expressões lambdas também dão os mesmo benefícios, porém são recomendadas para usos mais específicos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Classe local
&lt;/h2&gt;

&lt;p&gt;Classes locais são aquelas que você define dentro do bloco. Você normalmente encontra classes locais definidas dentro de corpo de métodos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ExemploClasseLocal&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;regularExpression&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"[^0-9]"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;//Método que precisamos&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;validarTelefone&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;telefone1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;telefone2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

        &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;tamanhoTelefone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

                &lt;span class="c1"&gt;//Criamos uma classe para poder implementar a lógica de validação do telefone&lt;/span&gt;
        &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NumeroTelefone&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

            &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;numeroTelefoneFormatado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

            &lt;span class="nc"&gt;PhoneNumber&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;numeroTelefone&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;

                &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;numeroAtual&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numeroTelefone&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replaceAll&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
                  &lt;span class="n"&gt;regularExpression&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numeroAtual&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;tamanhoTelefone&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                    &lt;span class="n"&gt;numeroTelefoneFormatado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numeroAtual&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;else&lt;/span&gt;
                    &lt;span class="n"&gt;numeroTelefoneFormatado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;

            &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getNumero&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;numeroTelefoneFormatado&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;


        &lt;span class="nc"&gt;NumeroTelefone&lt;/span&gt; &lt;span class="n"&gt;numero1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;NumeroTelefone&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;telefone1&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;NumeroTelefone&lt;/span&gt; &lt;span class="n"&gt;numero2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;NumeroTelefone&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;telefone2&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numero1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getNumero&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; 
            &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Primeiro número é inválido"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;
            &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Primeiro número é "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;numero1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getNumero&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numero2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getNumber&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Segundo número é inválido"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;
            &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Segundo número é  "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;numero2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getNumero&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;

    &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;//Chamando o nosso método de validação de telefone&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;validarTelefone&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"123-456-7890"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"456-7890"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use caso você precise criar mais de uma instância da classe, acessar seu construtor ou criar um novo.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://dev.to/diariodeumacdf/expressao-lambda-parte-i-classes-anonimas-1adc"&gt;Classe Anônima&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Use caso você precise declarar campos ou adicionar métodos.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://dev.to/diariodeumacdf/expressao-lambda-parte-ii-quando-e-como-usar-efm"&gt;Expressão Lambda&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Use caso você esteja encapsulando um único comportamento que você quer passar para outro trecho de código. Por exemplo, você pode usar expressão lambda se você quer que determinada ação performe em cada elemento de uma &lt;strong&gt;collection&lt;/strong&gt; quando o processo está completo ou quando o processo encontra algum erro.&lt;/p&gt;

&lt;p&gt;Você também pode usar caso precise de uma única instância de uma &lt;strong&gt;interface funcional&lt;/strong&gt; e você não precisa de nada muito completo (exemplo: você não precisa de construtor, um nome tipado, campos ou métodos adicionais).&lt;/p&gt;

&lt;p&gt;Fonte traduzida livremente: &lt;a href="https://docs.oracle.com/javase/tutorial/java/javaOO/whentouse.html"&gt;https://docs.oracle.com/javase/tutorial/java/javaOO/whentouse.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>todayilearned</category>
      <category>braziliandevs</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>O que eu já fiz sendo Developer Advocate... até o momento</title>
      <dc:creator>Carolina Dias Fonseca</dc:creator>
      <pubDate>Thu, 02 Dec 2021 14:50:55 +0000</pubDate>
      <link>https://dev.to/diariodeumacdf/o-que-eu-ja-fiz-sendo-developer-advocate-ate-o-momento-4jmn</link>
      <guid>https://dev.to/diariodeumacdf/o-que-eu-ja-fiz-sendo-developer-advocate-ate-o-momento-4jmn</guid>
      <description>&lt;p&gt;Hoje 02 de dezembro de 2021, completo 60 dias como &lt;strong&gt;developer advocate&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;E uma pergunta que recebo muito, tanto dentro como fora da empresa é: "Mas o que você faz exatamente?"&lt;/p&gt;

&lt;p&gt;E esse foi o meu primeiro aprendizado, falar que você é developer advocate é um tanto complicado, pois você não pertence exatamente a um time e muito menos é um cargo.&lt;/p&gt;

&lt;p&gt;Arrisco dizer que ser developer advocate é quase um modo de pensar, trabalhar e atuar no meio de tecnologia, porque você precisa saber tecnologia (não precisa ser necessariamente uma pessoa desenvolvedora, pode ser QA, SRE, tech writer, etc) o importante é que tu tenha conhecimento de algum universo da tecnologia e saiba aquilo bem.&lt;/p&gt;

&lt;p&gt;Por outro lado, temos contato com a comunidade, com a galera de marketing, com o time de engenharia (pois é, não somos nós que criamos/sustentamos a tecnologia que advogamos) e investimos umas boas horas de conversa com o pessoal de produto também, isso sem esquecer de conversar com a comunidade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Números 2 e 3
&lt;/h2&gt;

&lt;p&gt;Certo, mas ainda não respondi o que eu faço exatamente, né?&lt;/p&gt;

&lt;p&gt;Explicar o que eu faço e como faço, foi meu aprendizado número dois e, na mesma hora, veio o aprendizado de número três, porque cada empresa enxerga esse pokémon de uma forma um pouco diferente :) &lt;/p&gt;

&lt;p&gt;Então... vou falar o que eu fiz e como fiz até o momento na empresa em que trabalho (&lt;a href="https://www.zup.com.br/"&gt;Zup&lt;/a&gt;)&lt;/p&gt;

&lt;h2&gt;
  
  
  O que e como
&lt;/h2&gt;

&lt;p&gt;Nesses 60 dias, pensado nos times de engenharia e produto, eu me aprofundei no projeto do qual faço parte, mexi, revirei, testei, fiz algumas poc's, levei alguns feedbacks para o time de engenharia, pedi para a comunidade me dar a visão dela sobre aquele projeto, fui atrás de entender como a comunidade vê e entende o projeto.&lt;/p&gt;

&lt;p&gt;Já do lado de marketing, diria que foi mais uma troca levando feedbacks de como a comunidade recebe as informações, com o que ela curte interagir e receber novos projetos e/ou materiais. &lt;/p&gt;

&lt;p&gt;Além disso, ainda no que tange o marketing, ajudei a organizar um hackathon para a galera conhecer mais os projetos, aprender como eles funcionam e nos dar feedbacks também. Isso sem contar uma jornada colaborativa e minha primeira live coding para a galera começar a conhecer mais sobre o universo open source e, o mais recente, o TDC com palestras muito massas de galera especialista tanto da empresa como de mercado.&lt;/p&gt;

&lt;p&gt;Tudo isso em time e sempre trocando figurinha com a galera de marketing, de produto e engenharia. Algumas vezes, eu mesma fui lá e fiz alguma coisa, exemplo: Alterar uma documentação e subir para produção, corrigir um bug no projeto que advogo, sugerir algumas métricas de acompanhamento para o lado de growth do projeto, mapeamento de comunidade das quais me ajudaria a ter maior visão do projeto e que acredito que possam se beneficiar do mesmo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quais são os planos para os próximos passo?
&lt;/h2&gt;

&lt;p&gt;No momento estou estudando muito o universo que está relacionado ao produto que advogo, no caso, estamos falando de DevOps, automação, &lt;strong&gt;Python&lt;/strong&gt;, IaC, etc. Para poder falar com mais propriedade sobre tudo isso e também fazer artigos, live coding, palestras para compartilhar com a comunidade.&lt;/p&gt;

&lt;p&gt;Por esse motivo, como gosto de usar essa plataforma para "documentar" meus estudos e usá-lo para consultas futuras, vou compartilhar aqui conforme for aprendendo desse universo também :)&lt;/p&gt;

</description>
      <category>career</category>
      <category>devjournal</category>
      <category>braziliandevs</category>
      <category>devrel</category>
    </item>
    <item>
      <title>Padrões DAO e Repository</title>
      <dc:creator>Carolina Dias Fonseca</dc:creator>
      <pubDate>Thu, 18 Nov 2021 23:26:19 +0000</pubDate>
      <link>https://dev.to/diariodeumacdf/padroes-dao-e-repository-13nj</link>
      <guid>https://dev.to/diariodeumacdf/padroes-dao-e-repository-13nj</guid>
      <description>&lt;p&gt;O &lt;strong&gt;padrão DAO&lt;/strong&gt; (&lt;strong&gt;Data Access Object&lt;/strong&gt; ou, em pt-BR, Objeto de Acesso a Dados), é uma abstração de persistência de dados e é considerado próximo da camada de armazenamento de dados que, normalmente, é centrado em tabelas.&lt;/p&gt;

&lt;p&gt;Entretanto, em muitos casos, o DAO possui muitas tabelas permitindo, de uma forma mais direta, enviar/receber dados do banco, escondendo as queries mais feias.&lt;/p&gt;

&lt;p&gt;Exemplo de implementação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;
&lt;span class="c1"&gt;//Primeiramente, criamos a classe de domínio&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Usuario&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;//getters e setters&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;//Na sequência, criamos uma interface que provê um CRUD simples para a classe de Domínio do Usuário&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;UsuarioDao&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;criar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Usuario&lt;/span&gt; &lt;span class="n"&gt;usuario&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="nc"&gt;Usuario&lt;/span&gt; &lt;span class="nf"&gt;buscar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;atualizar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Usuario&lt;/span&gt; &lt;span class="n"&gt;usuario&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;deletar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;//Por fim, fazemos a implementação&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UsuarioDaoImpl&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;UsuarioDao&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;EntityManager&lt;/span&gt; &lt;span class="n"&gt;em&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;criar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Usuario&lt;/span&gt; &lt;span class="n"&gt;usuario&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
        &lt;span class="n"&gt;em&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;persist&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;usuario&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Usuario&lt;/span&gt; &lt;span class="nf"&gt;buscar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;em&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;find&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Usuario&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="c1"&gt;//...&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Padrão Repository
&lt;/h2&gt;

&lt;p&gt;De acordo com Eric Evans em seu livro &lt;strong&gt;Domain-Driven Design&lt;/strong&gt;, o "repository é um mecanismo para encapsular o banco, recuperar e buscar comportamento que simulam uma coleção de objetos."&lt;/p&gt;

&lt;p&gt;Ainda nessa mesma linha, o livro &lt;strong&gt;Padrão de Arquitetura de aplicações Enterprise&lt;/strong&gt;, do mesmo autor, diz que "entre as camadas de domínio e de mapeamento de dados, utiliza-se uma interface de coleção para acessar os objetos de domínio."&lt;/p&gt;

&lt;p&gt;Em outras palavras, o repository também lida com dados e esconde queries de forma semelhante ao padrão DAO. Porém, o repository se trata de uma padrão de alto nível, ou seja, muito mais próximo da lógica de negócio de uma aplicação.&lt;/p&gt;

&lt;p&gt;Consequentemente, um repository pode usar um DAO para pegar dados do banco e popular um objeto de domínio, da mesma forma que pode usar um DAO para pegar informações do objeto de domínio e mandar para o armazenamento no banco.&lt;/p&gt;

&lt;p&gt;Exemplo de implementação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;UsuarioRepository&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Usuario&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;adicionar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Usuario&lt;/span&gt; &lt;span class="n"&gt;usuario&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;atualizar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Usuario&lt;/span&gt; &lt;span class="n"&gt;usuario&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;remover&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Usuario&lt;/span&gt; &lt;span class="n"&gt;usuario&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UsuarioRepositoryImpl&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;UsuarioRepository&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="c1"&gt;//Aqui vamos utilizar o DAO&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;UsuarioDaoImpl&lt;/span&gt; &lt;span class="n"&gt;usuarioDaoImpl&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Usuario&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;usuarioDaoImpl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;buscar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;adicionar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Usuario&lt;/span&gt; &lt;span class="n"&gt;usuario&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
        &lt;span class="n"&gt;usuarioDaoImpl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;criar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;usuario&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;//...&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Olhando da forma como fizemos até o momento, ambas implementações parecem muito semelhantes, porque a classe Usuario é uma classe de domínio anêmica. E, o repository, é somente outra camada sobre o DAO.&lt;/p&gt;

&lt;p&gt;Entretanto, o DAO se torna um candidato perfeito para acesso aos dados enquanto que o Repository é uma forma ideal de se implementar um UseCase.&lt;/p&gt;

&lt;p&gt;Um exemplo mais rico sobre o uso do Repository como UseCase:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UsuarioRedeSocial&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Usuario&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Tweet&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;tweets&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UsuarioRepositoryImpl&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;UsuarioRepository&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="c1"&gt;//Aqui vamos utilizar o DAO&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;UsuarioDaoImpl&lt;/span&gt; &lt;span class="n"&gt;usuarioDaoImpl&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="c1"&gt;//Pulamos a etapa de criar o Tweet e TweetDao, mas só para acelerar a compreensão de uma classe de Domínio mais rica&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;TweetDaoImpl&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Usuario&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
        &lt;span class="c1"&gt;//não queremos mais apenas salvar o usuário, mas queremos o usuário e seus tweets&lt;/span&gt;
        &lt;span class="nc"&gt;UsuarioRedeSocial&lt;/span&gt; &lt;span class="n"&gt;usuario&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;UsuarioRedeSocial&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;usuarioDaoImpl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;buscar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;  
        &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Tweet&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;tweets&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tweetDaoImpl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fetchTweets&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;usuario&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getEmail&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;usuario&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setTweets&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tweets&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;usuario&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;adicionar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Usuario&lt;/span&gt; &lt;span class="n"&gt;usuario&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
        &lt;span class="n"&gt;usuarioDaoImpl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;criar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;usuario&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;//...&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse novo exemplo, temos agregação de informação que provê um objeto de domínio que é útil para o nosso UseCase. O poderíamos fazer o mesmo para as demais redes sociais, no mesmo Repository.&lt;/p&gt;

&lt;p&gt;Fonte: &lt;a href="https://www.baeldung.com/java-dao-vs-repository"&gt;DAO vs Repository Pattern&lt;/a&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>java</category>
      <category>braziliandevs</category>
      <category>todayisearched</category>
    </item>
    <item>
      <title>Expressão Lambda - Parte III (Sintaxe)</title>
      <dc:creator>Carolina Dias Fonseca</dc:creator>
      <pubDate>Thu, 11 Nov 2021 23:35:23 +0000</pubDate>
      <link>https://dev.to/diariodeumacdf/expressao-lambda-parte-iii-sintaxe-2apj</link>
      <guid>https://dev.to/diariodeumacdf/expressao-lambda-parte-iii-sintaxe-2apj</guid>
      <description>&lt;p&gt;Para finalizar a série sobre &lt;strong&gt;Lambdas do Java&lt;/strong&gt;, vamos seguir com a tradução do trecho sobre a sintaxe de uma expressão lambda.&lt;/p&gt;

&lt;p&gt;Uma expressão lambda em Java, consiste do seguinte:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uma lista separada por vírgula de parâmetros formais envolvidos por parênteses. No caso, é p
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getGenero&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nc"&gt;Pessoa&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Genero&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;MASCULINO&lt;/span&gt; 
    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getIdade&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;
    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getIdade&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Entretanto, você também pode omitir o parênteses caso se tenha somente um parâmetro ou usar apenas o parênteses sem o parâmetro. Exemplos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;//Somente o parênteses&lt;/span&gt;
&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getGenero&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nc"&gt;Pessoa&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Genero&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;MASCULINO&lt;/span&gt; 
    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getIdade&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;
    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getIdade&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;

&lt;span class="c1"&gt;//Somente o parâmentro&lt;/span&gt;
&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getGenero&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nc"&gt;Pessoa&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Genero&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;MASCULINO&lt;/span&gt; 
    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getIdade&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;
    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getIdade&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;A seta, →&lt;/li&gt;
&lt;li&gt;Um corpo que consiste de uma expressão única ou um bloco de declaração.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;//body&lt;/span&gt;
&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getGenero&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nc"&gt;Pessoa&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Genero&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;MASCULINO&lt;/span&gt; 
    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getIdade&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;
    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getIdade&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se você declara uma expressão única, o &lt;strong&gt;JRE&lt;/strong&gt; avalia a expressão e retorna o valor dela, em contra partida, você também pode utilizar uma declaração de retorno:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getGenero&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nc"&gt;Pessoa&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Genero&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;MASCULINO&lt;/span&gt; 
    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getIdade&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;
    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getIdade&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uma declaração de retorno não é uma expressão, numa expressão lambda você deve envolver a declaração com {}.&lt;/p&gt;

&lt;p&gt;Note que a expressão lambda parece muito com a declaração de um método, inclusive, você pode considerar a expressão lambda como um método anônimo - método sem nome.&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Calculadora&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;IntegerMath&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;operacao&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;   
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;operadorBinario&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;IntegerMath&lt;/span&gt; &lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;operacao&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

        &lt;span class="nc"&gt;Calculadora&lt;/span&gt; &lt;span class="n"&gt;meuApp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Calculadora&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;//Uso da expressão lambda como função anônima&lt;/span&gt;
        &lt;span class="nc"&gt;IntegerMath&lt;/span&gt; &lt;span class="n"&gt;adicao&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="nc"&gt;IntegerMath&lt;/span&gt; &lt;span class="n"&gt;subtracao&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"40 + 2 = "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
            &lt;span class="n"&gt;meuApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;operadorBinario&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;adicao&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"20 - 10 = "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
            &lt;span class="n"&gt;meuApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;operadorBinario&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;subtracao&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;    
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com isso, fechamos o assunto de expressão Lambda em Java :) no próximo post, veremos a tradução sobre &lt;strong&gt;Interface Funcional&lt;/strong&gt; que foi mencionada na &lt;a href="https://dev.to/diariodeumacdf/expressao-lambda-parte-ii-quando-e-como-usar-efm"&gt;parte 2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fonte: &lt;a href="https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html"&gt;Documentação Oracle&lt;/a&gt;&lt;/p&gt;

</description>
      <category>todayilearned</category>
      <category>braziliandevs</category>
      <category>java</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Expressão Lambda - Parte II (Quando e como usar)</title>
      <dc:creator>Carolina Dias Fonseca</dc:creator>
      <pubDate>Thu, 04 Nov 2021 23:16:29 +0000</pubDate>
      <link>https://dev.to/diariodeumacdf/expressao-lambda-parte-ii-quando-e-como-usar-efm</link>
      <guid>https://dev.to/diariodeumacdf/expressao-lambda-parte-ii-quando-e-como-usar-efm</guid>
      <description>&lt;p&gt;Parte 02 de 03 da documentação Oracle sobre &lt;strong&gt;Expressão Lambda&lt;/strong&gt; :)&lt;/p&gt;

&lt;p&gt;Um problema com classes anônimas é que, se sua implementação for muito simples (sendo uma interface que contém um único método, por exemplo), a sua sintaxe pode parecer incerta e não muito clara.&lt;/p&gt;

&lt;p&gt;Nesses casos, normalmente você está tentando passar funcionalidade como argumento para outro método, semelhante a iniciar uma ação quando alguém clica num botão.&lt;/p&gt;

&lt;p&gt;As &lt;strong&gt;expressões lambdas&lt;/strong&gt; te permitem fazer isso, trabalhar uma funcionalidade como argumento ou código como dado de informação.&lt;/p&gt;

&lt;p&gt;No &lt;a href="https://dev.to/diariodeumacdf/expressao-lambda-parte-i-classes-anonimas-1adc"&gt;artigo anterior sobre Classe Anônima&lt;/a&gt;, mostramos como implementar uma classe sem a necessidade de se criar uma classe com um único método e implementar/estender outra classe para seguir com a construção da sua aplicação.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;expressão Lambda&lt;/strong&gt; te permite fazer a mesma coisa, porém de uma forma mais conscisa ainda.&lt;/p&gt;

&lt;h2&gt;
  
  
  Caso de Uso Ideal para Expressão Lambda
&lt;/h2&gt;

&lt;p&gt;Vamos supor que você está criando uma aplicação de rede social. Você quer criar uma feature que permite o administrador a realizar determinada ação, como, por exemplo, enviar uma mensagem para membros que satisfaçam determinada condição.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm9yj42zkryicyc8ylus1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm9yj42zkryicyc8ylus1.png" alt="UML"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cada pessoa nessa rede social é representada pela classe Pessoa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Pessoa&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;enum&lt;/span&gt; &lt;span class="no"&gt;GENERO&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="no"&gt;MASCULINO&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="no"&gt;FEMININO&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="nc"&gt;LocalDate&lt;/span&gt; &lt;span class="n"&gt;nascimento&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="no"&gt;GENERO&lt;/span&gt; &lt;span class="n"&gt;genero&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;getIdade&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;&lt;span class="c1"&gt;//...}    &lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;printPessoa&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;&lt;span class="c1"&gt;//...}&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Suponha que os membros dessa rede social estão armazenado numa &lt;code&gt;List&amp;lt;Pessoa&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Passo 01: Criar métodos que encontrem membros que atendem a uma certa característica
&lt;/h2&gt;

&lt;p&gt;Uma forma muito simples de fazer essa filtragem é criar um método para cada tipo de filtro que se precisa fazer, como para gênero ou idade.&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;printPessoasMaioresQue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Pessoa&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;relacao&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Pessoa&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;relacao&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getIdade&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
            &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;printPessoa&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse método é muito frágil por conta da quantidade de atualizações que a aplicação ainda passará por conta de inclusão de novos membros.&lt;/p&gt;

&lt;p&gt;Outro ponto, suponha que você atualizou a sua aplicação e alterou a estrutura da classe Pessoa que passa a conter mais variáveis, talvez isso impacte em todos os lugares em que você instanciou a classe de forma que o algoritmo que usa essa informação agora haja de forma diferente.&lt;/p&gt;

&lt;p&gt;E, por fim, é um método restritivo, e se você precisar mostrar em tela usuários mais novo?&lt;/p&gt;

&lt;h2&gt;
  
  
  Passo 02: Criar métodos de busca mais generalizados
&lt;/h2&gt;

&lt;p&gt;O método abaixo é mais generalizado do que o anterior:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;printPessoasComIdadeEntre&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Pessoa&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;relacao&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;menor&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;maior&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Pessoa&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;relacao&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;menor&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getIdade&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getIdade&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;maior&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
            &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;printPessoa&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mas e se você quiser mostrar em tela membros de determinado gênero ou a combinação de idade e gênero?&lt;/p&gt;

&lt;p&gt;Ou se você quiser incluir atributos como status de relacionamento ou localização?&lt;/p&gt;

&lt;p&gt;Apesar do método acima ser mais genérico do que o anterior, ter que criar um método para cada possibilidade de busca ainda deixa o código frágil.&lt;/p&gt;

&lt;p&gt;Ao invés disso você pode separar as especificações de critério de busca do que você quer busca em classes separadas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passo 03: Especificar o código de critério de busca em uma classe local
&lt;/h2&gt;

&lt;p&gt;O método abaixo mostra em tela membros que atendem determinado critério de busca que você especificar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;printPessoas&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Perssoa&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;relacao&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;VerificaPessoa&lt;/span&gt; &lt;span class="n"&gt;criterio&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Pessoa&lt;/span&gt; &lt;span class="nl"&gt;p:&lt;/span&gt; &lt;span class="n"&gt;relacao&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;criterio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;buscaPessoa&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;)){&lt;/span&gt;
            &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;printPessoa&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse método verifica cada Pessoa que consta na List relacao, se a pessoa atender o critério passado em &lt;code&gt;criterio.buscaPessoa(p)&lt;/code&gt; então o método mostra em tela a pessoa.&lt;/p&gt;

&lt;p&gt;Para especificar o critério de busca, você implementa uma interface chamada &lt;code&gt;VerificaPessoa&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;VerificaPessoa&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;buscaPessoa&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Pessoa&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A classe que fará uso desse método, faz a implementação da interface, exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;VerificaPessoaElegivelParaExercito&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;VerificaPessoa&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;buscaPessoa&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Pessoa&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;genero&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nc"&gt;Pessoa&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Genero&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;MASCULINO&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getIdade&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para usar esse classe, você criar uma instância e invoca o printPessoa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;printPessoa&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;relacao&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;VerificaPessoaElegivelParaExercito&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apesar dessa estrutura ser menos frágil, você não precisa reescrever métodos se você alterar a classe Pessoa, você ainda tem código adicional: uma &lt;strong&gt;interface&lt;/strong&gt; nova e uma &lt;strong&gt;classe local&lt;/strong&gt; para cada busca que você pretende fazer na sua aplicação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passo 04: Especificar o critério de busca numa classe anônima
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;printPessoa&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;relacao&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;VerificaPessoa&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;buscaPessoa&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Pessoa&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;genero&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nc"&gt;Pessoa&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Genero&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;MASCULINO&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getIdade&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa forma reduz a quantidade de linhas de código porque você não precisa criar uma nova classe cada busca que você precisa realizar.&lt;/p&gt;

&lt;p&gt;Entretanto, a sintaxe de uma classe anônima é volumoso considerando que a interface VerificaPessoa só contém um método. Nesse caso, você pode usar uma expressão lambda ao invés da classe anônima.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passo 05: Especificar o critério de busca numa expressão lambda
&lt;/h2&gt;

&lt;p&gt;A interface VerificaPessoa é uma &lt;strong&gt;interface funcional&lt;/strong&gt;. Uma classe funcional é aquela que contém apenas um método abstrato.&lt;/p&gt;

&lt;p&gt;Exatamente por ela ser uma classe funcional que contém um único método abstrato, você pode omitir o nome do método quando você a implementa. Ao fazer isso, você estará implementando uma expressão lambda ao invés de uma classe anônima.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;printPessoa&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;relacao&lt;/span&gt;&lt;span class="o"&gt;,(&lt;/span&gt;&lt;span class="nc"&gt;Pessoa&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;)-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;genero&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nc"&gt;Pessoa&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Genero&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;MASCULINO&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getIdade&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você ainda pode usar uma interface funcional padrão no lugar de criar uma interface, o que ajuda a reduzir a criação de código.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;
&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Predicate&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Pessoa&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;buscaPessoa&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Pessoa&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;  
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;printPessoaComPredicate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Pessoa&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;relacao&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Predicate&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Pessoa&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;criterio&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Pessoa&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;relacao&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;criterio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;buscaPessoa&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
            &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;printPessoa&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;printPessoaComPredicate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;relacao&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getGenero&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nc"&gt;Pessoa&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Genero&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;MASCULINO&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getIdade&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getIdade&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fonte: &lt;a href="https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html" rel="noopener noreferrer"&gt;Documentação Oracle&lt;/a&gt;&lt;br&gt;
Colaboração: &lt;a href="https://dev.to/silvairsoares"&gt;Silvair Soares&lt;/a&gt;&lt;/p&gt;

</description>
      <category>todayilearned</category>
      <category>java</category>
      <category>braziliandevs</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Expressão Lambda - Parte I (Classes anônimas)</title>
      <dc:creator>Carolina Dias Fonseca</dc:creator>
      <pubDate>Thu, 28 Oct 2021 23:16:57 +0000</pubDate>
      <link>https://dev.to/diariodeumacdf/expressao-lambda-parte-i-classes-anonimas-1adc</link>
      <guid>https://dev.to/diariodeumacdf/expressao-lambda-parte-i-classes-anonimas-1adc</guid>
      <description>&lt;p&gt;Estudando um pouco sobre &lt;strong&gt;Expressão Lambda em Java&lt;/strong&gt;, acabei caindo na documentação e, consequentemente, li sobre Classe Anônima. &lt;/p&gt;

&lt;p&gt;Achei legal e resolvi traduzir e tentar resumir:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Classes anônimas&lt;/strong&gt; te permitem criar um código mais conciso. Elas te permitem declarar e instanciar uma classe ao mesmo tempo.&lt;/p&gt;

&lt;p&gt;Elas são como &lt;strong&gt;classes locais&lt;/strong&gt; exceto pelo fato de que elas não possuem nome.&lt;/p&gt;

&lt;p&gt;Recomenda-se que você as utilize caso precise de uma classe local uma única vez.&lt;/p&gt;

&lt;h2&gt;
  
  
  Declarando uma classe anônima
&lt;/h2&gt;

&lt;p&gt;Enquanto classes locais são classes declaradas, as classes anônimas são expressões o que significa que você define a classe em outra expressão.&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HelloWorldAnonymousClasses&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;HelloWorld&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;greetSomeone&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;someone&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;sayHello&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

        &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EnglishGreeting&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;HelloWorld&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"world"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;greetSomeone&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"world"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;greetSomeone&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;someone&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;someone&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
      &lt;span class="c1"&gt;//classe declarada na inicialização&lt;/span&gt;
        &lt;span class="nc"&gt;HelloWorld&lt;/span&gt; &lt;span class="n"&gt;englishGreeting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;EnglishGreeting&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;//classe anônima na inicialização da variável frenchGreeting&lt;/span&gt;
        &lt;span class="nc"&gt;HelloWorld&lt;/span&gt; &lt;span class="n"&gt;frenchGreeting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;HelloWorld&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"tout le monde"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;greetSomeone&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"tout le monde"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;greetSomeone&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;someone&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;someone&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Salut "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;};&lt;/span&gt;

        &lt;span class="c1"&gt;//classe anônima na inicialização da variável frenchGreeting&lt;/span&gt;
        &lt;span class="nc"&gt;HelloWorld&lt;/span&gt; &lt;span class="n"&gt;spanishGreeting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;HelloWorld&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"mundo"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;greetSomeone&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"mundo"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;greetSomeone&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;someone&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;someone&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hola, "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;};&lt;/span&gt;
&lt;span class="c1"&gt;//Mesmo efeito no final das constas&lt;/span&gt;
        &lt;span class="n"&gt;englishGreeting&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;greet&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;frenchGreeting&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;greetSomeone&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Fred"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;spanishGreeting&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;greet&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;HelloWorldAnonymousClasses&lt;/span&gt; &lt;span class="n"&gt;myApp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
            &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;HelloWorldAnonymousClasses&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;myApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sayHello&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;            
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Sintaxe da classe anônima
&lt;/h2&gt;

&lt;p&gt;Como já mencionado anteriormente, uma classe anônima é uma expressão.&lt;/p&gt;

&lt;p&gt;A sintaxe de uma classe anônima é igual a invocação de um &lt;strong&gt;construtor&lt;/strong&gt;, exceto pela definição contida no bloco de código.&lt;/p&gt;

&lt;p&gt;Considere a instância do objeto frenchGreeting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;HelloWorld&lt;/span&gt; &lt;span class="n"&gt;frenchGreeting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;HelloWorld&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"tout le monde"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;greetSomeone&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"tout le monde"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;greetSomeone&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;someone&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;someone&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Salut "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A classe anônima consiste no seguinte:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O operador &lt;code&gt;new&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;O nome de uma &lt;strong&gt;interface&lt;/strong&gt; para implementar ou para estender. No exemplo anterior, a classe anônima está implementando a interface HelloWorld.&lt;/li&gt;
&lt;li&gt;Parênteses que contém os argumentos para um construtor, exatamente igual a instância de uma classe normal. Nota: Quando você implementa uma interface, não tem construtor, então você só usa um par de parênteses igual ao exemplo.&lt;/li&gt;
&lt;li&gt;Um corpo onde se faz a declaração do corpo da classe. Mais especificamente, no corpo, declaração de método são permitidos porém declarações não.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Considerando que a definição de uma classe anônima é ser uma expressão, ela tem que ser parte de uma variável.&lt;/p&gt;

&lt;p&gt;Fonte: &lt;a href="https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html"&gt;Documentação Java&lt;/a&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>todayilearned</category>
      <category>braziliandevs</category>
      <category>programming</category>
    </item>
    <item>
      <title>Java Shell Tool</title>
      <dc:creator>Carolina Dias Fonseca</dc:creator>
      <pubDate>Thu, 21 Oct 2021 16:22:27 +0000</pubDate>
      <link>https://dev.to/diariodeumacdf/java-shell-tool-5d72</link>
      <guid>https://dev.to/diariodeumacdf/java-shell-tool-5d72</guid>
      <description>&lt;p&gt;Estava fazendo a trilha &lt;a href="https://learn.oracle.com/ols/learning-path/java-explorer/40805/79726" rel="noopener noreferrer"&gt;Java Explorer da Oracle&lt;/a&gt; e lá, pela primeira vez, ouvi falar sobre o &lt;strong&gt;Jshell&lt;/strong&gt; e resolvi escrever sobre ele, porque achei bem legal o que ele faz.&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;Java Shell Tool&lt;/strong&gt; (Jshell) é uma ferramenta interativa para aprender a programar em &lt;strong&gt;Java&lt;/strong&gt; e prototipar código. Jshell é é um &lt;strong&gt;Read-Evaluate-Print Loop&lt;/strong&gt; (REPL). Isso significa que ele vai ler (Read) e avaliar (Evaluate) os comandos e mostrar (Print) o resultado e então voltar ao início para o próximo input. O REPL faz o seu tempo de execução mais tangível e te permite testar hipóteses sobre isso.&lt;/p&gt;

&lt;p&gt;O JShell é utilizado via linha de comando, assim você pode fazer o input de dados no programa um por um e ver o resultado imediatamente, além da possibilidade de fazer os ajustes que forem necessários.&lt;/p&gt;

&lt;p&gt;O desenvolvimento de um programa Java, normalmente envolve o processo a seguir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Escrever o programa;&lt;/li&gt;
&lt;li&gt;Compilar e corrigir potenciais erros&lt;/li&gt;
&lt;li&gt;Rodar o programa&lt;/li&gt;
&lt;li&gt;Descobrir o que deu errado&lt;/li&gt;
&lt;li&gt;Editar&lt;/li&gt;
&lt;li&gt;Repetir o processo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;JShell auxiliar no processo de experimentação do código de forma muito mais simples. Te permite testar argumentos, testar variações de métodos e experimentar API's que você ainda não sabe usar no dia a dia.&lt;/p&gt;

&lt;h2&gt;
  
  
  JShell é melhor do que uma IDE?
&lt;/h2&gt;

&lt;p&gt;Não, o Jshell não substitui o uso de uma &lt;strong&gt;IDE&lt;/strong&gt;, ele apenas facilita e agilia o processo de aprendizado tanto sobre o Java como validação de hipóteses, conforme já mencionado anteriormente.&lt;/p&gt;

&lt;p&gt;Conforme você vai escrevendo o seu código, você pode colar trecho do código no JShell e testar ou então copiar o código que está testando no JShell e colar na sua IDE.&lt;/p&gt;

&lt;h2&gt;
  
  
  Usando o JShell
&lt;/h2&gt;

&lt;p&gt;O JShell faz parte do &lt;strong&gt;JDK9&lt;/strong&gt; e superiores, portanto, é necessário que tenha, ao menos, o JDK9 instalado em seu computador.&lt;/p&gt;

&lt;p&gt;A partir disso, basta ir ao terminar e digitar &lt;code&gt;jshell&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8txtcy75o27niya5w47g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8txtcy75o27niya5w47g.png" alt="Inicializando o Jshell"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Exemplo prático:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/tGfiiCGt69ZiU40K1M/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/tGfiiCGt69ZiU40K1M/giphy.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Trechos traduzidos de: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.oracle.com/javase/9/jshell/introduction-jshell.htm#JSHEL-GUID-630F27C8-1195-4989-9F6B-2C51D46F52C8" rel="noopener noreferrer"&gt;Documentação Oracle&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.freecodecamp.org/news/this-is-why-your-read-eval-print-loop-is-so-amazing-cf0362003983/" rel="noopener noreferrer"&gt;FreeCodeCamp: This is why your read-eval-print-loop is so amazing&lt;/a&gt;&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>java</category>
      <category>tooling</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Tipos de deploy e como isso impacta a vida de uma aplicação</title>
      <dc:creator>Carolina Dias Fonseca</dc:creator>
      <pubDate>Thu, 14 Oct 2021 23:09:59 +0000</pubDate>
      <link>https://dev.to/diariodeumacdf/tipos-de-deploy-e-como-isso-impacta-a-vida-de-uma-aplicacao-159d</link>
      <guid>https://dev.to/diariodeumacdf/tipos-de-deploy-e-como-isso-impacta-a-vida-de-uma-aplicacao-159d</guid>
      <description>&lt;p&gt;Na squad onde estava alocada, por ser a minha primeira aplicação em produção, resolvi acompanhar e aprender mais sobre esse universo chamado &lt;strong&gt;devops&lt;/strong&gt;, infra, enfim... toda a parte que não está envolvida com o código em si, mas com a estrutura de como isso vai rodar para o usuário.&lt;/p&gt;

&lt;p&gt;Nesse meio tempo de trabalho e estudos, conheci o &lt;strong&gt;CharlesCD&lt;/strong&gt; que trabalha com o conceito de deploy em círculos, bom... aqui começa a minha jornada de aprendizado sobre deploy, começa que existem tipos de deploy e eu sequer sabia disso, a seguir um compilado de artigo que encontrei sobre o tema.&lt;/p&gt;

&lt;h2&gt;
  
  
  Primeiramente, o que é um tipo deploy ou estratégia de deploy?
&lt;/h2&gt;

&lt;p&gt;Em algumas literaturas e empresas, chamamos de tipo de deploy ou estratégia de deploy a forma na qual a aplicação será colocada a disposição do usuário final.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Uma estratégia de deploy é uma forma de alterar ou atualização uma aplicação. O objetivo é fazer a mudança sem afetar a aplicação de forma que o usuário mal note as mudanças&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Fonte: &lt;a href="https://docs.openshift.com/container-platform/3.7/dev_guide/deployments/deployment_strategies.html"&gt;OpenShift - RedHat&lt;/a&gt;, tradução livre&lt;/p&gt;

&lt;h2&gt;
  
  
  Alguns tipos de deploys utilizados
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Canary
&lt;/h3&gt;

&lt;p&gt;O deploy do tipo &lt;strong&gt;Canary&lt;/strong&gt; visa reduzir o risco de disponibilizar uma atualização de uma única vez para todos os usuários, dessa forma, a atualização é disponibiliza para apenas um grupo seleto de usuários antes de ir para o público geral.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Em Canary, o ambiente antigo segue ativo simultaneamente ao novo ambiente. Por isso, pode-se liberar uma parcela dos usuários para acessar o novo ambiente e ver como ele se comporta com usuários reais. Assim é possível identificar se vão existir problemas no dia a dia.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Fonte: &lt;a href="https://blog.locaweb.com.br/temas/codigo-aberto/conheca-os-principais-tipos-de-deploy-e-quando-usar-cada-um/"&gt;Locaweb&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Entretanto, essa estratégia não propõe &lt;a href="https://docs.charlescd.io/v/v1.0.x-pt/faq/deploy-em-circulos-e-outros-deploys"&gt;nenhuma estratégia de escolha de usuários para a expansão&lt;/a&gt;. Por esse motivo, torna-se mais difícil gerenciar as versões existentes do sistema, o que contribui para que não haja tanto versionamento.&lt;/p&gt;

&lt;h3&gt;
  
  
  Blue-Green
&lt;/h3&gt;

&lt;p&gt;O tipo &lt;strong&gt;blue-green&lt;/strong&gt; trabalha com o conceito de espelhamento, ou seja, a instância da versão antiga e a instância da versão mais recente rodam em paralelo em produção e o &lt;strong&gt;SRE&lt;/strong&gt; utiliza um &lt;strong&gt;load balancer&lt;/strong&gt; para ir direcionando o tráfego da versão antiga para a versão mais recente.&lt;/p&gt;

&lt;p&gt;O principal benefício desta técnica é que o downtime é zero, trazendo mais segurança para a transição. Apesar disso, &lt;a href="https://docs.charlescd.io/v/v1.0.x-pt/faq/deploy-em-circulos-e-outros-deploys"&gt;o custo para o blue-green deployment é bastante elevado&lt;/a&gt;, já que demanda o dobro de infraestrutura para ser executado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Círculos
&lt;/h3&gt;

&lt;p&gt;A ideia consiste que se crie círculos de implementação, e disponibilize para cada circulo a versão de software que melhor convém para o usuário e para a regra de negócio.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Círculos são grupos de usuários criados a partir de características específicas dentro de um mesmo ambiente. Dessa forma, o desenvolvedor pode segmentar os usuários de acordo com as regras que mais fizerem sentido para testar aquela release.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Fonte: &lt;a href="https://docs.charlescd.io/v/v1.0.x-pt/principais-conceitos"&gt;CharlesCD - ZupInnovation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por exemplo, é possível criar um círculo de engenheiros da região Norte do Brasil, outro de engenheiros do sudeste e um terceiro contendo todos os engenheiros brasileiros. Baseado nessa segmentação de clientes, pode-se elaborar diversas lógicas de deploy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão de uma desenvolvedora
&lt;/h2&gt;

&lt;p&gt;Claramente que não há a melhor estratégia aqui, tudo vai depender da necessidade da empresa/instituição que vai implementar a aplicação e nível de conhecimento do SRE, por exemplo, para escolher qual será utilizada.&lt;/p&gt;

&lt;p&gt;Na minha concepção, tendo a vivência de atuar na área comercial e de negócios e agora atuando como desenvolvedora, faz muito sentido utilizar o deploy em círculo para testar hipóteses desde de alterações na UX para o cliente (será que ele prefere um botão aqui ou ali? Isso aqui está mais legível para ele ou não? Esse pop-up é mais inclusivo para a terceira idade ou não?) até implementação de novas regras de negócio (precisamos aumentar a conversão de clientes nessa área do e-commerce, será que se expormos a oferta dessa forma funcionará? temos esse bug na rotina, mas será que é bug mesmo? Nosso público-alvo são os estudantes do sudeste, será que eles são os maiores usuários da nossa ferramenta?).&lt;/p&gt;

&lt;p&gt;Por experiência minha, eu sofria demais com as demandas que clientes me passavam de mudanças que eles gostariam, mas nunca acontecia ou então demorava meses para "subir", com a ideia de deploy em círculos esse cenário muda drasticamente.&lt;/p&gt;

&lt;p&gt;E você, o que acha desses conceitos? Algum faz mais sentido para você, assim como o deploy em círculos faz mais sentido para mim?&lt;/p&gt;

&lt;p&gt;Compartilha aqui comigo!&lt;/p&gt;

</description>
      <category>devops</category>
      <category>braziliandevs</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>Programação Orientada a Aspectos</title>
      <dc:creator>Carolina Dias Fonseca</dc:creator>
      <pubDate>Thu, 07 Oct 2021 23:12:09 +0000</pubDate>
      <link>https://dev.to/diariodeumacdf/programacao-orientada-a-aspectos-54bn</link>
      <guid>https://dev.to/diariodeumacdf/programacao-orientada-a-aspectos-54bn</guid>
      <description>&lt;p&gt;Dando sequência aos meus estudos sobre &lt;strong&gt;Micronaut&lt;/strong&gt;, dei de cara com mais um conceito que não conhecia muito e resolvi pesquisar mais sobre.&lt;/p&gt;

&lt;p&gt;Dessa vez, me refiro à &lt;strong&gt;Programação Orientada a Aspectos&lt;/strong&gt; que, para a surpresa de ninguém, &lt;a href="https://docs.spring.io/spring-framework/docs/2.5.x/reference/aop.html" rel="noopener noreferrer"&gt;o Spring também trabalha com ela&lt;/a&gt; (se você quiser).&lt;/p&gt;

&lt;p&gt;A Programação Orientada a Aspectos (ou Aspects Oriented Programming - AOP) foi um estudo desenvolvido por: Gregor Kiczales, John Lamping, Anurag Mendhekar, Chris Maeda, Cristina Videira Lopes,Jean-Marc Loingtier, John Irwin em 1997.&lt;/p&gt;

&lt;p&gt;Esse estudo teve por objetivo melhorar alguns pontos complexos no desenvolvimento de código que nem o paradigma procedural e nem a &lt;strong&gt;orientação a objetos&lt;/strong&gt; conseguiam resolver. Os autores apontam que exatamente esses pontos complexos são os aspectos do design de código que, novamente, a OOP não consegue resolver por mais que ela busque representar o mundo real.&lt;/p&gt;

&lt;p&gt;Por conta disso, os autores apresentam uma nova técnica de programação chamada orientada a aspectos, onde é possível usar isolamento de forma apropriada, reutilizar código e composição tudo baseado no aspecto do código. O que eu acredito ser bem relevante sobre o artigo dessa galera é que, em momento algum, eles não falam que OOP, Programação Procedural ou até mesmo a Programação Funcional são ruins, mas sim que a AOP é uma forma de complementar essas programações em pontos que geralmente deixam o desenvolvimento com um código complexo de ser desenvolvido e, posteriormente, dar manutenção.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ok, mas o que exatamente é um aspecto na programação?
&lt;/h2&gt;

&lt;p&gt;Enquanto um componente tende a ser uma unidade do sistema como, por exemplo, uma imagem, conta bancária, etc. Aspectos são propriedades que afetam a performance e a semântica dos componentes de forma sistemática, por exemplo, padrão de acesso e sincronização de objetos concorrentes, conforme imagem abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwz8ky3vog6q79be0kkg7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwz8ky3vog6q79be0kkg7.png" alt="Aspectos de acordo com o paradigma"&gt;&lt;/a&gt;&lt;br&gt;
Fonte: &lt;a href="https://www.cs.ubc.ca/~gregor/papers/kiczales-ECOOP1997-AOP.pdf" rel="noopener noreferrer"&gt;Aspect-Oriented Programming&lt;/a&gt; traduzido por: Carolina Fonseca&lt;/p&gt;

&lt;p&gt;Para facilitar mais na explicação, os autores usam erros e falhas como base, pois sabemos que são os pontos mais comuns no dia a dia como desenvolvedores, afinal, sempre teremos que customizar/adicionar algum handle quer seja para captar qualquer tipo de erro que dê na aplicação ou lidar com erros/falhas específicas.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Many performance-related issues are aspects, because performance optimizations often exploit information about the execution context that spans components."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Muitos problemas relacionados a performance, são aspectos. Porque a otimização de performance sempre explora a informação sobre o contexto de execução onde os componentes estão.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mão no código
&lt;/h2&gt;

&lt;p&gt;Vamos ver um exemplo prático usando Java como base, no caso, vamos utilizar a Biblioteca Digital sugerida na imagem anterior:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

public class Livro {
    String título, autor;
    int isbn;  

    public String getTitulo(){
        return título;  
    }
    public String getAutor(){
        return autor;  
    }
    public int getIsbn() {
        return isbn;  
    }
}

public class Repository {
    private Livro livros[];
    private int nlivros = 0;

    public Repository (int dbsize)  {    
        livros = new Livro[dbsize];  
    }

    public void registrar (Livro liv)  {    
        livros [nlivros++] = liv;  
    }

    public void retirar (Livro liv)  {    
            ... 
    }

}   


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Os autores destacam que programas como o acima, onde precisam gerenciar todas as instâncias criadas de suas classes e as chamadas de métodos, não são capazes de fazer esse gerenciamento todo sozinho, afinal, estamos falando de uma estrutura cujo foco é a abstração que queremos fazer do sistema real e não como ele vai gerenciar todas as sua chamadas.&lt;/p&gt;

&lt;p&gt;O mais indicado seria o uso de &lt;strong&gt;reflection&lt;/strong&gt; para acessar essa comunicação de forma distribuída, porém, criar reflection no nível de detalhe que a OOP precisa, acaba se tornando algo muito complexo.&lt;/p&gt;

&lt;p&gt;É aqui onde temos uma oportunidade real de se utilizar a AOP:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

remote Repository { 
        void registrar (Livro); 
        void retirar (Livro: copy isbn); 
        Livro: copy isbn busca(String);}


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Acima temos um trecho de código com foco no aspecto da comunicação. Basicamente, ele comunica ao &lt;strong&gt;Repository&lt;/strong&gt; que quando novos livros são registrados, ele deve criar uma cópia daquele objeto e quando o livro é retirado ele deve copiar somente o número de isbn, o restante do livro não é copiado a menos que seja preciso mais tarde.&lt;/p&gt;

&lt;h2&gt;
  
  
  O Join e as reflections
&lt;/h2&gt;

&lt;p&gt;Em AOP, temos um conceito chamado Join que nada mais é do que o momento em que unimos o nosso componente ao seu aspecto, uma vez que, em inglês, join significar unir, esse conceito faz total sentido.&lt;/p&gt;

&lt;p&gt;E ela faz mais sentido ainda quando falamos de reflection e metaobjetos, porque um sistema reflexivo disponibiliza a base da semântica e implementação da linguagem que estamos utilizando. Falando da &lt;a href="https://pt.wikipedia.org/wiki/Metaprograma%C3%A7%C3%A3o" rel="noopener noreferrer"&gt;metalinguagem&lt;/a&gt;, temos acesso à todas as chamadas de funções e stack de execução que, a nível humano, nunca conseguimos ver. Vendo por esse ângulo, é no baixo nível onde é possível aplicarmos os joins da AOP de forma que a reflection faça todo o restante do trabalho, dessa forma, temos os nossos aspectos criados para fins de controle das instâncias e vinculados ao reflection que nem precisamos criar já que utilizamos da própria linguagem para tal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Admito que enquanto lia o artigo que "criou" o AOP, não esperava encontrar o uso de reflections nele, mas passou a se fazer muito sentido de quando comparamos o uso delas no Spring e no Micronaut.&lt;/p&gt;

&lt;p&gt;O Spring já faz as reflections todas de uma vez, ou seja, já vamos fazendo o mapeamento de aspectos no tempo de compilação, ao passo que o Micronaut também faz esse gerenciamento de aspectos, porém somente do que realmente está sendo utilizado na aplicação mas em tempo de pré-compilação, mas falarei mais sobre isso nos próximos artigos ;)&lt;/p&gt;

&lt;p&gt;Espero que tenha gostado e se acha que faltou algo ou escrevi algo sem sentido, me chama para conversamos!&lt;/p&gt;

&lt;p&gt;Fonte: &lt;a href="https://www.cs.ubc.ca/~gregor/papers/kiczales-ECOOP1997-AOP.pdf" rel="noopener noreferrer"&gt;https://www.cs.ubc.ca/~gregor/papers/kiczales-ECOOP1997-AOP.pdf&lt;/a&gt;&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>java</category>
      <category>oop</category>
      <category>functional</category>
    </item>
    <item>
      <title>Como funciona a famosa injeção de dependência e porque ela é importante</title>
      <dc:creator>Carolina Dias Fonseca</dc:creator>
      <pubDate>Thu, 30 Sep 2021 11:41:33 +0000</pubDate>
      <link>https://dev.to/diariodeumacdf/como-funciona-a-famosa-injecao-de-dependencia-e-porque-ela-e-importante-3dii</link>
      <guid>https://dev.to/diariodeumacdf/como-funciona-a-famosa-injecao-de-dependencia-e-porque-ela-e-importante-3dii</guid>
      <description>&lt;p&gt;Um ponto interessante sobre o mundo &lt;strong&gt;Java&lt;/strong&gt; é a enorme quantidade de atividades em construir alternativas para o &lt;a href="https://www.guj.com.br/t/voce-sabe-o-que-e-j2ee/204071/3" rel="noopener noreferrer"&gt;J2EE&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Muito disso vem da complexidade do universo do &lt;strong&gt;J2EE&lt;/strong&gt;, mas além disso, explorando alternativas é de onde vem as ideias criativas.&lt;/p&gt;

&lt;p&gt;Um problema comum em lidar com diferentes elementos é, por exemplo: "Como conectar uma arquitetura web com a interface do banco dedados quando eles são construídos por diferentes times e com conhecimentos distintos?"&lt;/p&gt;

&lt;p&gt;Foi desse tipo de problema que surgiram inúmeros frameworks com o objetivo de conectar os componentes do J2EE de diferentes camadas. No caso do Java, o mais conhecido é o &lt;a href="https://spring.io/" rel="noopener noreferrer"&gt;Spring&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Inclusive, até o &lt;strong&gt;Spring&lt;/strong&gt; já conta com alguns "variantes" digamos assim por conta de saber trabalhar muitos bem com essa componentização. Frameworks que se basearam/propõem a serem melhores que o Spring, por exemplo, são: &lt;a href="https://micronaut.io/" rel="noopener noreferrer"&gt;Micronaut&lt;/a&gt; e &lt;a href="https://quarkus.io/" rel="noopener noreferrer"&gt;Quarkus&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Por baixo desses frameworks temos um número interessantes de design principles, o que vai além dos containers do J2EE. Vamos ver alguns desses princípios!&lt;/p&gt;

&lt;h2&gt;
  
  
  Componentes e Serviços
&lt;/h2&gt;

&lt;p&gt;Para fins de padronização de termos, aqui utilizaremos componentes no sentido de: arquivos .JAR, dll ou até mesmo a importação de uma biblioteca.&lt;/p&gt;

&lt;p&gt;E serviços no sentido de: serviço web, mensageria, RPC ou até mesmo um socket.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exemplo simples
&lt;/h2&gt;

&lt;p&gt;Vamos utilizar o exemplo de um componente que lista filmes por diretor.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class ConsultorDeFilmes {

    public Filme[] filmeDirigidoBy(String diretor) {
        List todosFilmes = finder.findAll();
        for (Iterator it = todosFilmes.iterator(); it.hasNext(); ) {
            Filme filme = (Filme) it.next();
            if (!filme.getDiretor().equals(diretor)) it.remove();
        }
        return (Filme[]) todosFilmes.toArray(new Filme[todosFilmes.size()]);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A implementação dessa função é totalmente simples, é pedido para encontrar um objeto retornar todos os filmes da lista. Depois é solicitado que ele retorne somente os filmes dirigidos pelo diretor que queremos.&lt;/p&gt;

&lt;p&gt;O ponto que vamos focar nessa implantação é no finder.findAll();&lt;/p&gt;

&lt;p&gt;mais especificamente em como nós conectamos o objeto que é solicitado (o diretor) com um objeto finder em particular. A razão disso ser interessante é que eu quero que o método filmeDirigidoBy seja completamente independente de como todos os são armazenados.&lt;/p&gt;

&lt;p&gt;Basicamente o método que estamos estudando se resume ao finder e tudo o que o finder faz é saber como responder ao método findAll. Dessa forma, podemos definir uma interface para o finder.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public interface ProcuraFilmes{
    List findAll();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com isso, nós desacoplamos o findAll(), mas ainda assim teremos que torná-lo em classe concreta em algum momento para retornar os filmes que queremos. Então faremos de forma que o código passe para o construtor do ConsultorDeFilmes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class ConsultorDeFilmes {

        private ProcuraFilmes finder;
        public ConsultorDeFilmes(){
            finder = new ColunaDelimitadaProcuraFilmes("filmes1.txt");  
    }

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O nome da classe de implementação vendo do fato de estamos usando um arquivo .txt delimitado por colunas.&lt;/p&gt;

&lt;p&gt;Agora se eu usar essa classe somente nessa implementação, está ok, mas o que acontece se mais alguém quiser uma cópia dessa mesma aplicação? 🤔&lt;/p&gt;

&lt;p&gt;Simples, caso a pessoa armazene os filmes em um arquivo .txt delimitado por colunas chamado "filmes1.txt", a aplicação vai rodar tranquilamente. Caso use um nome de arquivo diferente, por exemplo, ela só precisa alterar o nome na classe de implantação, até aqui, ok.&lt;/p&gt;

&lt;p&gt;Porém e se ela utilizar uma forma totalmente diferente de armazenar os filmes, por exemplo, num banco de dados SQL, um arquivo XML, um serviço web, entre outros?🤔🤔&lt;/p&gt;

&lt;p&gt;Nesse caso, precisaremos de um classe diferente para fazer a implantação e puxar os dados. E aqui está o ponto: Porque nós colocamos o ProcuraFilme como uma interface, isso não vai alterar o método filmesDirigidoBy , mas ainda assim precisamos de uma forma de instanciar o finder de forma correta na implementação.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv1rwl3a0cm898iuvuiue.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv1rwl3a0cm898iuvuiue.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MovieLister == ConsultorDeFilmes // MovieFinder == ProcuraFilmes // MovieFinderImpl == implementação concreta da interface. Fonte: &lt;a href="https://martinfowler.com/articles/injection/naive.gif" rel="noopener noreferrer"&gt;https://martinfowler.com/articles/injection/naive.gif&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A imagem acima mostra como a nossa classe ConsultorDeFilmes está dependendo tanto da interface ProcuraFilmes como de sua classe concreta, nós precisamos que a classe dependa apenas da interface.&lt;/p&gt;

&lt;p&gt;Mas como fazer isso? 🤔🤔🤔&lt;/p&gt;

&lt;p&gt;A classe de implementação não está linkada à aplicação em tempo de compilação e não sabemos como essa pessoa fará a implementação da interface. Ou seja, corremos o risco de ter o código alterado (implementação da interface que consta no ConsultorDeFilmes) e, consequentemente, a aplicação vai quebrar.&lt;/p&gt;

&lt;p&gt;Por isso precisamos que a classe ConsultorDeFilmes dependa apenas da interface, ignore a forma como ela é implementada e seja capaz de rodar a instância dela.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Nós chamamos essa situação de &lt;strong&gt;plugin&lt;/strong&gt;, numa situação real podemos ter milhares de serviços e componentes que precisamos implementar de diferentes formas. O plugin interage com esses serviços e componentes através de interfaces e, então, eles decidem as implementações sem alterar a nossa aplicação.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Voltando a nossa pergunta anterior: Mas como fazer isso? 🤔🤔🤔&lt;/p&gt;

&lt;p&gt;A resposta: &lt;strong&gt;Inversão de Controle&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Inversão de controle
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Como mencionado anteriormente, a inversão de controle é uma característica muito comum de alguns frameworks, mas falar que eles são especiais por conta disso é o mesmo que falar que uma ferrari é especial porque ela tem pneus.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O que importa mesmo é: "Qual aspecto de controle esses frameworks invertem?"&lt;/p&gt;

&lt;p&gt;Inversão de controle é o que diferencia um framework de uma biblioteca. Uma biblioteca é somente um conjunto de funções que você utiliza, já um framework é um design abstrato com comportamentos. No framework você precisa colocar comportamento em vários lugares em subclasses ou plugando em suas próprias classes f(o Spring faz isso utilizando Beans e Annotations, por exemplo).&lt;/p&gt;

&lt;p&gt;Na nossa aplicação, instanciamos o finder diretamente, o que o impede de ser um plugin. Uma saída é garantir que qualquer usuário desse plugin siga as convenções que queremos e injete isso em suas implementações.&lt;/p&gt;

&lt;p&gt;Pensando nisso, Inversão de Controle (Inversion of Control - IoC) é um termo muito genérico e, de acordo com vários especialistas, o termo, nesse caso, seria &lt;strong&gt;Injeção de Dependência&lt;/strong&gt; (Dependecy Injection).&lt;/p&gt;

&lt;h2&gt;
  
  
  Formas de Injeção de Dependência
&lt;/h2&gt;

&lt;p&gt;A ideia da injeção de dependência é ter um "montador" ou assembler que poupla o campo na classe ConsultorDeFilmes com a implementação apropriada da interface ProcuraFilmes, ficando da seguinte forma:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fagg2udilk5b64b0na9y0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fagg2udilk5b64b0na9y0.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MovieLister == ConsultorDeFilmes // MovieFinder == ProcuraFilmes // MovieFinderImpl == implementação concreta da interface. Assembler == Montador Fonte: &lt;a href="https://martinfowler.com/articles/injection/injector.gif" rel="noopener noreferrer"&gt;https://martinfowler.com/articles/injection/injector.gif&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em cima desse diagrama, temos 3 formas principais de fazer a injeção de dependência:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inversão de Controle tipo 01 - &lt;strong&gt;Injeção por interface&lt;/strong&gt; (Injection Interface)&lt;/li&gt;
&lt;li&gt;Inversão de Controle tipo 02 - &lt;strong&gt;Injeção por setter&lt;/strong&gt;(Setter Interface)&lt;/li&gt;
&lt;li&gt;Inversão de Controle tipo 03 - &lt;strong&gt;Injeção por contrutor&lt;/strong&gt;(Constructor Interface)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para o nosso caso, vamos falar sobre o Spring.&lt;/p&gt;

&lt;p&gt;Essa framework inclui camadas de abstração para transações, frameworks de persistência em banco de dados, aplicação web e JDBC. Ele suporta tanto a injeção por construtor como por setter, mas os desenvolvedores dele preferem a injeção por setter, vamos ver como fica nesse caso.&lt;/p&gt;

&lt;p&gt;Para que o nosso ConsultorDeFilmes aceite a injeção, temos que definir o método set para o serviço.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class ConsultorDeFilmes {

    private ProcuraFilmes finder;
    public void setFinder(ProcuraFilmes finder){
        this.finder = finder;
    }

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Também vamos definir um setter para o nome do arquivo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class ArquivoConsultorDeFilmes {

    public void setNomeArquivo(String nomeArquivo){
        this.nomeArquivo = nomeArquivo;
    }

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O último passo é fazer a configuração, o Spring suporta configurações por arquivos XML e no código também, mas por XML é o mais apropriado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;beans&amp;gt;
    &amp;lt;bean id="ConsultorDeFilmes" class="spring.ConsultorDeFilmes"&amp;gt;
        &amp;lt;property name="finder"&amp;gt;
            &amp;lt;ref local="ProcuraFilmes"/&amp;gt;
        &amp;lt;/property&amp;gt;
    &amp;lt;/bean&amp;gt;
    &amp;lt;bean id="ProcuraFilmes" class="spring.ArquivoConsultorDeFilmes"&amp;gt;
        &amp;lt;property name="nomeArquivo"&amp;gt;
            &amp;lt;value&amp;gt;filmes1.txt&amp;lt;/value&amp;gt;
        &amp;lt;/property&amp;gt;
    &amp;lt;/bean&amp;gt;
&amp;lt;/beans&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Um exemplo de como testar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public void testComSpring() throws Exception {
    ApplicationContext ctx = new

FileSystemXmlApplicationContext("spring.xml");
    ConsultorDeFilmes consultor = (ConsultorDeFilmes)

ctx.getBean("ConsultorDeFilmes");
    Filmes[] filmes = consultor.filmesDirigidosBy("James Cameron");

    assertEquals("Titanic", movies[0].getTitle());
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finalizando...&lt;/p&gt;

&lt;p&gt;Primeiramente gostaria de agradecer a sua curiosidade e paciência em ler até aqui, boa parte do texto foi tradução minha dos textos do &lt;a href="https://martinfowler.com/" rel="noopener noreferrer"&gt;Martin Fowler&lt;/a&gt;, tentei ao máximo ser fiel às explicações dele, alguns pontos que achei muito complexo, tentei simplificar a explicação para que ficasse mais claro para mim e para ti 😉 e também acrescentei um pouco do meu ponto de vista.&lt;/p&gt;

&lt;p&gt;Quero ressaltar aqui também, caso seja user do Spring e suas famosas annotations: as annotations nada mais são do que interfaces, logo, elas seguem o mesmo princípio da inversão de controle mencionado ao longo do texto. Lembre-se que criamos uma bean e no Spring temos o &lt;a class="mentioned-user" href="https://dev.to/bean"&gt;@bean&lt;/a&gt;, aqui a conclusão fica fácil, certo?&lt;/p&gt;

&lt;p&gt;Fontes: &lt;a href="https://martinfowler.com/articles/injection.html" rel="noopener noreferrer"&gt;https://martinfowler.com/articles/injection.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://martinfowler.com/bliki/InversionOfControl.html" rel="noopener noreferrer"&gt;https://martinfowler.com/bliki/InversionOfControl.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>beginners</category>
      <category>java</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>O que uma boa API Rest deve ter e porquê?</title>
      <dc:creator>Carolina Dias Fonseca</dc:creator>
      <pubDate>Fri, 24 Sep 2021 01:13:30 +0000</pubDate>
      <link>https://dev.to/diariodeumacdf/o-que-uma-boa-api-rest-deve-ter-e-porque-4k14</link>
      <guid>https://dev.to/diariodeumacdf/o-que-uma-boa-api-rest-deve-ter-e-porque-4k14</guid>
      <description>&lt;h2&gt;
  
  
  Mas antes, o que é REST?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;REST&lt;/strong&gt; é um tipo de arquitetura web desenvolvido por &lt;strong&gt;Roy Thomas Fielding&lt;/strong&gt;, em seus estudos ele procurou entender os principais problemas da web e como poderia ajudar a melhorar a performance, escalabilidade e demais problemas que haviam relacionados ao tema, isso lá em 2000.&lt;/p&gt;

&lt;p&gt;Nos seus estudos, ele consta que o principal problema da www era:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; Como compartilhar informações com todo mundo de forma estruturada sendo que em cada terminal de comunicação (tanto lado do cliente como do servidor) haviam informações de formas variadas (textos, imagens, vídeos, etc), tamanhos variados e sistemas operacionais diversos (linux, windows, etc)?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Isso era (e ainda é) um questionamento muito importante tendo em vista que a web é cada dia mais utilizada e deveria ter a possibilidade de transitar qualquer tipo de informação de forma rápida, eficiente e escalável.&lt;/p&gt;

&lt;p&gt;Sendo assim, Roy Fielding, se embasando em arquiteturas já existentes, elaborou a arquitetura REST de comunicação web.&lt;/p&gt;

&lt;p&gt;REST é o acrônomo de &lt;strong&gt;Representational State Transfer&lt;/strong&gt; ou, do português, Transferência Representacional de Estado (tradução livre).&lt;/p&gt;

&lt;h2&gt;
  
  
  Características da arquitetura REST
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Responsabilidades na relação cliente-servidor (client-server) são separadas, isso significa que a preocupação da parte visual fica com o cliente enquanto que o servidor fica com o lado de armazenamento/recuperação de dados, assim temos uma distribuição de tarefas muito melhor e nem dos lados fica sobrecarregado.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Isso é um ponto interessante, pois, automaticamente, auxilia na simplicidade do processo de comunicação (uma vez que o lado do servidor é independente do que ocorre do lado do cliente) e melhora a escalabilidade.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A comunicação é &lt;strong&gt;STATELESS&lt;/strong&gt;, ou seja, ela não guarda em memória as requisições e respostas dessas requisições. Isso auxilia na simplicidade da comunicação, uma vez que, para que a requisição tenha a sua resposta, ela deve vir completa e, em caso de erro, fica fácil de visualizar onde está o erro.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Também é escalável, exatamente por conta dessa simplicidade da comunicação, ou seja, o servidor não precisa gerenciar arquivos em memória (o que atrapalharia muito performance, por exemplo) e é confiável, pois, caso não siga o protocolo, a comunicação dará erro&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;É &lt;strong&gt;CACHEABLE&lt;/strong&gt;, ou seja, mantém um cache (uma memória de respostas de determinadas requisições já feitas anteriormente) para retorno mais rápido caso. Isso serve para corrigir um ponto de performance da questão do stateless, porque, sem o recurso de cache, a arquitetura sempre terá que recuperar a mesma resposta do zero, sendo que ela poderia ter uma performance melhor se já tivesse a resposta pronta.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mas como o cache não entra em conflito com o stateless? Simples, o stateless significa que a aplicação não guarda nenhum estado de requisição, login, etc, entretanto, com o cache, já temos uma resposta pronta caso a requisição feita seja alguma já feita anteriormente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A &lt;strong&gt;arquitetura REST&lt;/strong&gt; tem uma interface uniforme, ou seja, qualquer aplicação que siga essa arquitetura, se comunicará sempre da mesma forma com as especificações que serão melhor faladas mais a frente.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Como o REST transita as informações?
&lt;/h2&gt;

&lt;p&gt;Diferentemente do que muita gente acha, a arquitetura REST NÃO transita o objeto (imagem, arquivo, audio, etc) em si, mas sim uma representação dele (eis aí o nome de transferência representacional de estado). Ela segue a mesma ideia de encapsulamento da informação que se vê no mundo da programação orientada a objetos, onde temos os getters e setters.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbo3gp5oinplnnbv16q66.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbo3gp5oinplnnbv16q66.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;fonte: Roy Fielding (&lt;a href="https://www.ics.uci.edu/%7Efielding/pubs/dissertation/rest_arch_style.htm" rel="noopener noreferrer"&gt;https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Nessa arquitetura, quando queremos ter acesso à uma imagem, por exemplo, a chamamos de recurso, ou seja, qualquer item que se queira ter acesso (receber ou enviar) chamamos de recurso. Esse recurso terá um identificador (aqui é onde entra a idea do &lt;strong&gt;getter&lt;/strong&gt;), o identificador será uma URI. Quando ser acessar o identificador, aí sim temos o acesso ao recurso, no nosso exemplo teremos acesso à imagem.&lt;/p&gt;

&lt;p&gt;A representação é a forma como esse recurso será apresentado, no caso, no formato metadata (chave e valor), atualmente é muito comum ser representado no formato &lt;strong&gt;JSON&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;E, por fim, o control data especifica o motivo da comunicação e como ela ocorre, ou seja, o que a requisição quer e como ela precisa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Entendendo um pouco sobre os problemas da web e como queremos fazer a comunicação de forma prática, escalável e mais padronizada, faz muito sentido seguirmos o &lt;strong&gt;padrão REST&lt;/strong&gt; no momento de construirmos uma API.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
