<?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>Forem: Matheus Poda</title>
    <description>The latest articles on Forem by Matheus Poda (@devmpoda).</description>
    <link>https://forem.com/devmpoda</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%2F847554%2Ff3d31f4f-bf4e-45a3-bafc-ab6bf5b37d7b.jpeg</url>
      <title>Forem: Matheus Poda</title>
      <link>https://forem.com/devmpoda</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/devmpoda"/>
    <language>en</language>
    <item>
      <title>⚙️ Arquitetura II: Não dê sorte ao azar</title>
      <dc:creator>Matheus Poda</dc:creator>
      <pubDate>Mon, 14 Aug 2023 11:04:14 +0000</pubDate>
      <link>https://forem.com/devmpoda/arquitetura-ii-nao-de-sorte-ao-azar-kho</link>
      <guid>https://forem.com/devmpoda/arquitetura-ii-nao-de-sorte-ao-azar-kho</guid>
      <description>&lt;p&gt;Olá queridos(as) devs!&lt;/p&gt;

&lt;p&gt;Sejam bem-vindos ao segundo artigo de uma série que estou começando a publicar. Neles, vou abordar diversos temas de arquitetura, desde os fundamentos até modelos, padrões, etc.&lt;/p&gt;

&lt;p&gt;No entanto, neste artigo, iremos discutir algo de extrema importância: as &lt;strong&gt;características arquiteturais&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Neste artigo, você irá aprender rapidamente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Você considera explicitamente a arquitetura ao desenvolver um software?&lt;/li&gt;
&lt;li&gt;O que são características estruturais?&lt;/li&gt;
&lt;li&gt;O que é uma característica operacional?&lt;/li&gt;
&lt;li&gt;O que é uma característica estrutural?&lt;/li&gt;
&lt;li&gt;Pontos importantes a serem considerados no dia a dia&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vamos começar! 🔥&lt;/p&gt;




&lt;h3&gt;
  
  
  Não de sorte ao azar
&lt;/h3&gt;

&lt;p&gt;No cotidiano, é comum desenvolvermos diversas funcionalidades, resolver problemas e entregar produtos. No entanto, muitas vezes fazemos escolhas automáticas, sem pensar muito nelas.&lt;/p&gt;

&lt;p&gt;Com o tempo, essa abordagem pode prejudicar a qualidade do software, uma vez que negligenciamos aspectos que podem ser cruciais. Por isso, quero abordar um tópico &lt;strong&gt;extremamente&lt;/strong&gt; importante na arquitetura de software: as &lt;strong&gt;características arquiteturais&lt;/strong&gt;. São vários pontos que não devemos ignorar.&lt;/p&gt;

&lt;p&gt;Tenho certeza de que, ao compreender um pouco mais sobre isso, sua abordagem ao desenvolvimento de projetos mudará completamente.&lt;/p&gt;

&lt;p&gt;Vamos lá! 🚀&lt;/p&gt;




&lt;h3&gt;
  
  
  Características Arquiteturais
&lt;/h3&gt;

&lt;p&gt;Ao desenvolver uma solução, sempre temos requisitos - os requisitos funcionais estão mais relacionados ao negócio e suas funcionalidades de valor, enquanto os requisitos não funcionais focam mais no sistema em si.&lt;/p&gt;

&lt;p&gt;Com o tempo, o termo "requisito não funcional" tem sido substituído cada vez mais por "características de arquitetura". Isso envolve pensar e destacar aspectos importantes do software, que, se bem desenvolvidos, trarão maior segurança e qualidade à aplicação.&lt;/p&gt;

&lt;p&gt;Ao considerar essas características, estamos usando uma abordagem de análise arquitetural em vez de focar apenas no domínio de negócio. Isso nos permite analisar os pontos de arquitetura do software.&lt;/p&gt;

&lt;p&gt;Hoje em dia, não é possível listar &lt;strong&gt;todas&lt;/strong&gt; as características arquiteturais que um software pode ter, mas podemos agrupá-las em três categorias: &lt;strong&gt;Características Operacionais&lt;/strong&gt;, &lt;strong&gt;Características Estruturais&lt;/strong&gt; e o que chamamos de &lt;strong&gt;cross-cutting&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ter uma compreensão desses grupos lhe dará mais confiança ao opinar sobre uma solução e entender a visão macro e micro do software. Além disso, você deixará de apenas superficialmente considerar esses pontos em seu cotidiano e passará a ter um olhar mais crítico sobre as decisões tomadas.&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%2Fe5eyy544dztvfo4t5p6u.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%2Fe5eyy544dztvfo4t5p6u.png" alt="Características arquiteturais"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Características Operacionais
&lt;/h3&gt;

&lt;p&gt;Quando consideramos essas características, estamos analisando a operação do software. Isso inclui:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Disponibilidade&lt;/strong&gt;: Quanto tempo meu projeto estará disponível (24/7)?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confiabilidade&lt;/strong&gt;: Segurança, autenticação, segurança em geral, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Escalabilidade&lt;/strong&gt;: Como meu sistema escala? Horizontalmente (adicionando máquinas)? Verticalmente (aumentando o poder computacional)?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recuperação&lt;/strong&gt;: Caso algo dê errado, tenho algum tipo de backup preparado?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note que tudo relacionado às operações (inclusive o papel do DevOps) faz parte desse grupo.&lt;/p&gt;

&lt;p&gt;Ter um entendimento mínimo sobre esses aspectos ao desenvolver o sistema é crucial, uma vez que todos podem afetar a forma como o sistema será operado.&lt;/p&gt;




&lt;h3&gt;
  
  
  Características Estruturais
&lt;/h3&gt;

&lt;p&gt;Como o nome sugere, esta seção trata da estrutura do sistema. Aqui, discutimos os suportes que sustentarão nosso software. Isso inclui aspectos relacionados ao código, configuração da aplicação, instalação, etc.&lt;/p&gt;

&lt;p&gt;Alguns exemplos de conceitos importantes nesta categoria:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Configurabilidade&lt;/strong&gt;: Quão fácil é configurar o software e seus componentes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extensibilidade&lt;/strong&gt;: Os componentes da aplicação devem estar prontos para evoluir.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Facilidade de Instalação&lt;/strong&gt;: O software deve ser facilmente instalável e não apresentar problemas durante o deployment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reutilização de Componentes&lt;/strong&gt;: Os componentes da aplicação devem ser projetados para reutilização em diferentes contextos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Facilidade de Manutenção&lt;/strong&gt;: Um software com boas práticas de código e baixo acoplamento será mais fácil de manter.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Características Cross-cutting
&lt;/h3&gt;

&lt;p&gt;Este grupo engloba conceitos importantes para o software, mas que não se encaixam diretamente nas categorias anteriores.&lt;/p&gt;

&lt;p&gt;Estes incluem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Acessibilidade&lt;/strong&gt;: O sistema deve ser acessível para os usuários.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conformidade Legal e Privacidade&lt;/strong&gt;: O software deve atender às leis e termos de privacidade, como a LGPD no Brasil.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Segurança&lt;/strong&gt;: Embora possa ser considerado como parte da Confiabilidade, a segurança do projeto merece atenção extra.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Usabilidade&lt;/strong&gt;: Compreender como o usuário interage com o software e melhorar esses aspectos.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Pontos importantes
&lt;/h3&gt;

&lt;p&gt;É praticamente impossível incorporar todas as características em um software, devido ao custo e ao tempo envolvidos. Você sempre terá que definir uma lista de características mais importantes, seja em colaboração com as partes interessadas do projeto, requisitos ou conhecimento técnico sobre possíveis problemas que o software pode enfrentar.&lt;/p&gt;

&lt;p&gt;Por exemplo:&lt;/p&gt;

&lt;p&gt;Imagine que sua solução envolve um processo de pagamento. Você pode ter duas opções:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Se esse processo for realizado por um terceiro, não precisamos de certificações de segurança; criptografia de dados seria suficiente.&lt;/li&gt;
&lt;li&gt;Se o processo de pagamento for feito pelo software, precisamos focar na confiabilidade e na segurança do usuário.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Toda arquitetura de software envolve trocas - você ganha algo em troca de outra coisa. Por isso, é crucial manter o objetivo da solução em mente.&lt;/p&gt;

&lt;p&gt;A maior dica que posso dar é: &lt;strong&gt;Não busque a melhor arquitetura possível; escolha a menos ruim&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ao manter esses pontos em mente, comece a observá-los nos softwares com os quais você trabalha! Tente não negligenciar esses temas enquanto desenvolve.&lt;/p&gt;




&lt;h2&gt;
  
  
  Me acompanhe em minhas redes sociais.
&lt;/h2&gt;

&lt;p&gt;Obrigado pelo seu tempo!&lt;/p&gt;

&lt;p&gt;Compartilhem com seus colegas de estudo/trabalho.&lt;br&gt;
Me chama nas redes sociais a baixo para trocarmos uma ideia e tirar dúvidas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/matskira" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/matheuspoda/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/devmpoda" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/@devmpoda/videos" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Até a próxima!&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>architecture</category>
      <category>beginners</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>⚙️ Arquitetura de Software: O início</title>
      <dc:creator>Matheus Poda</dc:creator>
      <pubDate>Mon, 31 Jul 2023 11:26:59 +0000</pubDate>
      <link>https://forem.com/devmpoda/arquitetura-de-software-o-inicio-1hmb</link>
      <guid>https://forem.com/devmpoda/arquitetura-de-software-o-inicio-1hmb</guid>
      <description>&lt;p&gt;Olá meus queridos(as) devs!&lt;/p&gt;

&lt;p&gt;Sejam bem-vindos ao primeiro artigo de uma série de outros que vou estar começando a publicar, neles vou estar abrangendo diversos assuntos de arquitetura, desde os fundamentos, até os modelos, padrões e etc!&lt;/p&gt;

&lt;p&gt;Mas esse aqui será o ponto de partida, nele quero falar alguns tópicos.&lt;/p&gt;

&lt;p&gt;Você rapidamente irá aprender:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quais são os tipos de arquitetos?;&lt;/li&gt;
&lt;li&gt;O que é a arquitetura de software?;&lt;/li&gt;
&lt;li&gt;Qual é o papel de um arquiteto de software?;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vamos começar 🔥&lt;/p&gt;




&lt;h3&gt;
  
  
  Quais são os tipos de arquitetos?
&lt;/h3&gt;

&lt;p&gt;Por incrível que pareça, dentro do mundo de TI, temos vários tipos de arquitetos, alguns próximos dos negócios, enquanto outros mais próximos do código.&lt;/p&gt;

&lt;p&gt;Quero abordar os principais:&lt;/p&gt;

&lt;p&gt;Quero abordar dos principais:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Arquiteto Corporativo&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Arquiteto De Soluções&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Arquiteto de Software&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Arquiteto Tecnológico&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Arquiteto Corporativo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Esse arquiteto tem como foco a área de organização e governança da empresa que desenvolverá determinado software. Seus principais papéis são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compreender o mercado e as inovações;&lt;/li&gt;
&lt;li&gt;Organizar as tecnologias que a empresa utilizará na criação do software;&lt;/li&gt;
&lt;li&gt;Definir a cultura que os times de desenvolvimento irão adotar;&lt;/li&gt;
&lt;li&gt;Entender os custos e valores relacionados às equipes e tecnologias;&lt;/li&gt;
&lt;li&gt;Possuir conhecimento técnico, embora seu trabalho esteja mais voltado para o negócio.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Arquiteto de Soluções&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O arquiteto de soluções atua como intermediário entre os setores de negócio e software, desempenhando as seguintes funções:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Transformar os requisitos de negócio em uma solução de software;&lt;/li&gt;
&lt;li&gt;Compreender as tecnologias já utilizadas pela empresa e determinar a necessidade de adoção de novas tecnologias para a criação do software;&lt;/li&gt;
&lt;li&gt;Implementar tecnologias de acordo com o problema apresentado;&lt;/li&gt;
&lt;li&gt;Ter visão do negócio e considerar suas particularidades;&lt;/li&gt;
&lt;li&gt;Expressar a solução arquitetural por meio de desenhos e diagramas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Arquiteto de Software&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O arquiteto de software trabalha mais diretamente com as equipes de desenvolvimento e desempenha os seguintes papéis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compreender os recursos do time e identificar as tecnologias com as quais o time está familiarizado;&lt;/li&gt;
&lt;li&gt;Projetar o modelo, padrão e boas práticas que o time de desenvolvimento deverá seguir;&lt;/li&gt;
&lt;li&gt;Manter sempre a visão de que o desenho do software deve priorizar a evolução e a escalabilidade;&lt;/li&gt;
&lt;li&gt;Garantir que o código escrito e as decisões tomadas estejam em conformidade com os padrões estabelecidos;&lt;/li&gt;
&lt;li&gt;Auxiliar o time em uma visão macro e micro do projeto de software.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Arquiteto Tecnológico&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;São especialistas em uma ou mais tecnologias específicas, possuindo amplo conhecimento sobre elas e sabendo indicar a melhor escolha para resolver determinados problemas.&lt;/p&gt;

&lt;p&gt;Por exemplo, podemos ter um Arquiteto Tecnológico especializado em Microsoft Azure, que deverá possuir amplo conhecimento das ferramentas desse serviço, a fim de orientar seu uso na solução de determinados problemas. Da mesma forma, podem existir Arquitetos Java, Arquitetos de banco de dados, entre outros.&lt;/p&gt;

&lt;p&gt;Ilustração resumida dos tipos:&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%2Ffniqxi5t876kvihojkjb.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%2Ffniqxi5t876kvihojkjb.png" alt="Ilustração dos tipos de arquitetura"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  O que é arquitetura de software?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Arquitetura de software são as coisas importantes de um software. O que quer que isso seja. - Ralph Johnson&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Gosto de começar a sintetizar o que é arquitetura de software, com essa frase incrível.&lt;/p&gt;

&lt;p&gt;A definição concreta, foi estabelecida pela IEEE Standard 1471, que traz um acordo sobre o que é o conceito:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Arquitetura de software pode ser definida como a organização fundamental de um sistema, seus componentes, as relações entre eles e o ambiente que guia seu design e evolução. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Resumidamente, a arquitetura não é necessariamente um cargo, é um conhecimento que faz parte da engenharia de software.&lt;/p&gt;

&lt;p&gt;Com este conhecimento, construímos um software que oferece soluções para o negócio, trabalhando com atributos de qualidade e preparado para a evolução.&lt;/p&gt;

&lt;p&gt;Além disso, a arquitetura se preocupa em componentizar o software, atribuindo responsabilidades de forma clara e estabelecendo bons relacionamentos entre eles.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quais são os papéis da arquitetura de software?
&lt;/h2&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%2F0hprpeu27nddzjiykq0h.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%2F0hprpeu27nddzjiykq0h.png" alt="papeis da arquitetura de software"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O papél de uma boa arquietura de software é:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Entender o negócio e a motivação por trás da criação de determinado software;&lt;/li&gt;
&lt;li&gt;Com base nesse entendimento, definir os atributos de qualidade (testes, segurança, UX/UI, custo, servidor etc.);&lt;/li&gt;
&lt;li&gt;Desenhar uma solução que seja viável para o time, levando em consideração as habilidades e competências da equipe, não se limitando apenas a selecionar o que há de melhor no mercado;&lt;/li&gt;
&lt;li&gt;Auxiliar o time de desenvolvimento a adotar boas práticas no processo de design (SOLID, Design Patterns, paradigmas etc.);&lt;/li&gt;
&lt;li&gt;Manter o ciclo de desenvolvimento organizado para garantir a governança e a evolução do software.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O quinto item é, em minha opinião, um dos mais importantes. Não basta criar uma arquitetura bem estruturada, com ótimas práticas para escalabilidade e resiliência, se, ao longo do tempo, tudo se tornar desorganizado e caótico. É essencial governar e defender a arquitetura selecionada.&lt;/p&gt;

&lt;p&gt;O responsável por manter a ordem normalmente se baseia em atividades como Code Review, uso de ferramentas de automação no processo de CI/CD, entre outras.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O arquiteto de software é, idealmente, um orquestrador. Ele garante que todas as partes interessadas sejam ouvidas e suas ponderações sejam levadas em conta na formulação da arquitetura. Para isso, elabora e mantém artefatos abrangentes que facilitam o engajamento. - Elemar Jr.&lt;/p&gt;
&lt;/blockquote&gt;




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

&lt;p&gt;Normalmente, confundimos arquitetura de software com um cargo, e embora ele possa ser, nunca deixará de ser um conhecimento e um conjunto de práticas. Podemos encontrar diversos cargos, como Tech Leads, desenvolvedores seniores, gerentes técnicos, entre outros, que são responsáveis por desempenhar esses papéis.&lt;/p&gt;

&lt;p&gt;Além disso, a arquitetura de software é parte integrante da engenharia de software. Não devemos depender unicamente de uma única pessoa para tomar decisões importantes; esse processo precisa ser executado em equipe, pois é assim que podemos ter ideias melhores e refinar o melhor caminho para a entrega de um bom software.&lt;/p&gt;

&lt;p&gt;Nos próximos artigos, vou explorar esses conceitos em detalhes e espero contar com a participação de vocês, meus caros leitores!&lt;/p&gt;




&lt;h2&gt;
  
  
  Me acompanhe em minhas redes sociais.
&lt;/h2&gt;

&lt;p&gt;Obrigado pelo seu tempo!&lt;/p&gt;

&lt;p&gt;Compartilhem com seus colegas de estudo/trabalho.&lt;br&gt;
Me chama nas redes sociais a baixo para trocarmos uma ideia e tirar dúvidas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/matskira" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/matheuspoda/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/devmpoda" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/@devmpoda/videos" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Até a próxima!&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>softwareengineering</category>
      <category>beginners</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Simplificando Binary Search 🔎</title>
      <dc:creator>Matheus Poda</dc:creator>
      <pubDate>Thu, 29 Jun 2023 18:57:31 +0000</pubDate>
      <link>https://forem.com/devmpoda/simplificando-binary-search-3h5i</link>
      <guid>https://forem.com/devmpoda/simplificando-binary-search-3h5i</guid>
      <description>&lt;p&gt;Nessa série de posts que escrevo, vou falar sobre algoritmos mais utilizados para determinadas tarefas.&lt;/p&gt;

&lt;p&gt;A ideia é sempre seguir o seguinte objetivo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Demonstrar o problema que ele soluciona;&lt;/li&gt;
&lt;li&gt;Demonstrar como ele soluciona;&lt;/li&gt;
&lt;li&gt;Mostrar o código;&lt;/li&gt;
&lt;li&gt;Mostrar algo já pronto;&lt;/li&gt;
&lt;li&gt;Finalizar com uma ou mais perguntas de entrevistas, como desafio.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No post de hoje, iremos abordar &lt;strong&gt;binary search&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;No final vou estar deixando uma pergunta que é muito encontrada em entrevistas técnicas, não vou dar a resposta de cara, vou adicionar ela aqui após uma semana, então tente responder e deixar nos comentários.&lt;/p&gt;




&lt;h2&gt;
  
  
  Problema
&lt;/h2&gt;

&lt;p&gt;Imagine o seguinte cenário, em uma lista de números com 11 inteiros, podemos exibir como a matriz a baixo.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Posição&lt;/th&gt;
&lt;th&gt;Número inteiro&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;46&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;84&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Precisamos criar um algoritmo que irá pesquisar pelo número inteiro e retornar sua posição, mas como podemos fazer isso?&lt;/p&gt;

&lt;p&gt;Bom podemos aplicar uma &lt;strong&gt;simple search&lt;/strong&gt; (pesquisa simples), que vai ser um looping varrendo de um a um, percorrendo cada posição da lista até encontrar o número que deseja. &lt;/p&gt;

&lt;p&gt;Em termos de Big O, que resumidamente, seria uma função de medirmos o tempo de processamento dos nossos algoritmo (caso tenha mais interesse em saber a fundo, vou deixar um artigo excencial nas referências), ao pensar nessa solução temos O(n), que chamamos de função linear.&lt;/p&gt;

&lt;p&gt;Significa que o tempo de execução é igual ao tamanho da estrutura de dados, no caso como temos uma matriz de 11 elementos, temos que O(11), ele irá percorrer a lista e nos entregar o resultado em até 11 passos.&lt;/p&gt;

&lt;p&gt;Mas existe uma forma de conseguirmos diminuir este tempo, usando a &lt;strong&gt;binary search&lt;/strong&gt; (pesquisa binária), para não aprofundar muito em Big O, ela é considerada O(log2 n), que significa, &lt;strong&gt;um ótimo tempo&lt;/strong&gt;. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O log2 n, significa que é log na base 2.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Podemos ver pelo gráfico a baixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0-AfLxcE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sooxz85q5lkr993s470a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0-AfLxcE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sooxz85q5lkr993s470a.png" alt="gráfico big o" width="788" height="534"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  O que é a binary search?
&lt;/h2&gt;

&lt;p&gt;O algoritmo funciona da seguinte forma, ele cortará ao meio uma determinada lista, verificando se o item que está no meio é o que estamos procurando, caso não seja, irá condicionar se o item é maior ou menor que o do meio, conseguindo cortar a parte maior ou menor da lista e vai repetindo o processo até encontrar a posição do item que queremos.&lt;/p&gt;

&lt;p&gt;É importante colocar aqui um &lt;strong&gt;aviso importante&lt;/strong&gt;, não é possível usar essa forma de pesquisa, caso a lista que você está usando não esteja ordenada, pois o resultado desse algoritmos, retorna a posição do item, se tivesse dois ou mais itens iguais, ele iria ignorar e retornar o primeiro que encontrar.&lt;/p&gt;

&lt;p&gt;Voltando ao cenário da nossa lista de números inteiros, desejamos encontrar o número 24 lista, primeiro iremos encontrar o meio:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Posição&lt;/th&gt;
&lt;th&gt;Número inteiro&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;16 (&lt;strong&gt;meio&lt;/strong&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;46&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;84&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;O meio é o 16, a lista está ordenada em ordem crescente, 16 é maior ou igual a 24? Não, logo é menor que 24, cortamos a fatia de números menores na lista.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Posição&lt;/th&gt;
&lt;th&gt;Nome do Contato&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;26 (&lt;strong&gt;meio&lt;/strong&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;46&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;84&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;O meio é 26, novamente entra na condicional, 26 é maior ou igual a 24? Sim! Então iremos arrancar a fatia com números maiores, sobrando...&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Posição&lt;/th&gt;
&lt;th&gt;Nome do Contato&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;O meio agora é 1.5, mas como a posição é inteira, iremos arredondar para 1 (como normalmente as linguagens de programação fazem). Logo temos 19, esse número é maior que 24? Não, então cortamos.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Posição&lt;/th&gt;
&lt;th&gt;Nome do Contato&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Por fim sobrou nosso número! Como retorno iremos receber &lt;strong&gt;7&lt;/strong&gt;, que é a posição da lista que se encontra o número 24. &lt;/p&gt;

&lt;p&gt;Viu como ficou mais rápido? Encontramos o valor em 3 passos, sendo que se fossemos pela simple search levariamos até 11 passos.&lt;/p&gt;

&lt;p&gt;A fórmula para você descobrir quantos passos levaria é bem simples.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pesquisa&lt;/th&gt;
&lt;th&gt;Fórmula&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Simple Search&lt;/td&gt;
&lt;td&gt;n&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Binary Search&lt;/td&gt;
&lt;td&gt;log 2 n (log de base 2)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;p&gt;Suponha que você tenha uma lista com 128 números e esteja fazendo uma pesquisa simples e binária. Qual seria o número máximo de etapas que você levaria para encontrar o número desejado?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pesquisa simples O(n) = O(128), logo 128 passos&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Pesquisa binária O(log2 n) = O(7)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para realizar o cálculo de log, pode usar uma calculadora científica, ou usar um site como &lt;a href="https://miniwebtool.com/br/log-base-2-calculator/"&gt;este&lt;/a&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  O código do algoritmo
&lt;/h2&gt;

&lt;p&gt;Beleza, entendemos a teoria, agora vamos colocar na prática e desenvolver um código que seja capaz de funcionar como explicado.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Irei estar utilizando Java, mas o belo dos algoritmos é que ela pode ser escrita em qualquer linguagem, dê uma olhada no repositório do &lt;a href="https://github.com/egonSchiele/grokking_algorithms/tree/master/01_introduction_to_algorithms"&gt;Aditya Bhargava&lt;/a&gt;, escritor do livro &lt;em&gt;Entendendo Algoritmos&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Vou estar colocando o código inteiro e vamos quebrar em etapas:&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;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt; &lt;span class="nf"&gt;binarySearch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;list&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;item&lt;/span&gt;&lt;span class="o"&gt;)&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;baixo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&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;alto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;list&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;1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;baixo&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;alto&lt;/span&gt;&lt;span class="o"&gt;)&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;meio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;baixo&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;alto&lt;/span&gt;&lt;span class="o"&gt;)&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="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;chute&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;meio&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;chute&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;item&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;meio&lt;/span&gt;&lt;span class="o"&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;chute&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;alto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;meio&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;baixo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;meio&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&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="k"&gt;return&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parte 1: Definindo o máximo e mínimo da lista&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="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;baixo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&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;alto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;list&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;1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui praticamente estamos adotando o primeiro valor máximo e mínimo da lista, começando com 0, e como as matrizes e vetores começam com 0, nós fazemos o tamanho da lista -1 para encontrar o máximo.&lt;/p&gt;

&lt;p&gt;Parte 2: O algoritmo&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="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;baixo&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;alto&lt;/span&gt;&lt;span class="o"&gt;)&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;meio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;baixo&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;alto&lt;/span&gt;&lt;span class="o"&gt;)&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="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;chute&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;meio&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;chute&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;item&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;meio&lt;/span&gt;&lt;span class="o"&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;chute&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;alto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;meio&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;baixo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;meio&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&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;ul&gt;
&lt;li&gt;O looping será executado até que o alto fique igual ou menor que baixo;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Definimos o valor que representa o meio.&lt;br&gt;
&lt;code&gt;int meio = (baixo + alto) / 2;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;E o valor do chute.&lt;br&gt;
&lt;code&gt;int chute = list[meio];&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Tendo isso em mente, vamos agora verificar a condicional que expliquei na teoria:&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="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chute&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;item&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;meio&lt;/span&gt;&lt;span class="o"&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;chute&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;alto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;meio&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;baixo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;meio&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&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;ul&gt;
&lt;li&gt;Se o chute for igual ao item, retornamos a posição do meio.&lt;/li&gt;
&lt;li&gt;Se o chute for maior que o item, iremos alterar o valor do tamanho máximo da lista, para que cortemos os valores maiores que o meio.&lt;/li&gt;
&lt;li&gt;Se o chute for menor que o item, iremos alterar o valor do tamanho mínimo da lista, para que cortemos os valores menores que o meio.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Assim no final iremos conseguir, caso exista o número na lista, encontrar sua posição, caso contrário, retorna nulo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Código para você brincar no seu compilador&lt;/strong&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="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.Arrays&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;class&lt;/span&gt; &lt;span class="nc"&gt;BinarySearch&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;static&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt; &lt;span class="nf"&gt;binarySearch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;list&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;item&lt;/span&gt;&lt;span class="o"&gt;)&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;baixo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&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;alto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;list&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;1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;baixo&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;alto&lt;/span&gt;&lt;span class="o"&gt;)&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;meio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;baixo&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;alto&lt;/span&gt;&lt;span class="o"&gt;)&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="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;chute&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;meio&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;chute&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;item&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;meio&lt;/span&gt;&lt;span class="o"&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;chute&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;alto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;meio&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;baixo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;meio&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&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="k"&gt;return&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="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="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;minhaLista&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1&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="mi"&gt;8&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;12&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;46&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;84&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="n"&gt;binarySearch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;minhaLista&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;24&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="n"&gt;binarySearch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;minhaLista&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&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;
  
  
  Simplificações do Colections do Java
&lt;/h2&gt;

&lt;p&gt;Obviamente no mercado, se você precisar de uma binary search, a Colections do Java, já tem esse algoritmo pronto, basta usar da seguinte forma.&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;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;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;listaInteiros&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Arrays&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;asList&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&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="mi"&gt;8&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;12&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;46&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;84&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;minhaLista&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1&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="mi"&gt;8&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;12&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;46&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;84&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;item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;24&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="nc"&gt;Collections&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;binarySearch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;listaInteiros&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item&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="nc"&gt;Arrays&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;binarySearch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;minhaLista&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item&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;
  
  
  Pergunta de entrevista
&lt;/h2&gt;

&lt;p&gt;Pergunta: Dado uma lista ordenado em ordem descrescente de números inteiros, escreva um código que encontre o elemento da lista, considerando o fator de tempo, como O(log2 n).&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;br&gt;
&lt;strong&gt;INPUT: Encontre o valor 8 em {42,36,29,25,14,8,3,1}&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;OUTPUT: 5&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Resposta da pergunta
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;A resposta será liberada no dia 06/07/23, a ideia é que você tente resolver e disponibilize sua ideia e código nos comentários (código pode subir no github e postar aqui, mas explique o que você pensou).&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Entendendo Algoritmos: Um guia ilustrado, por Aditya Y. Bhargava;&lt;/li&gt;
&lt;li&gt;Algoritmos, de José Augusto e Jaya Figueireido;&lt;/li&gt;
&lt;li&gt;Cracking the Coding Interview, de Gayle Laakmann;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Links úteis
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=Z0bH0cMY0E8"&gt;Big O&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.bigocheatsheet.com/"&gt;Big O cheat sheet&lt;/a&gt;;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Me acompanhe em minhas redes sociais.
&lt;/h2&gt;

&lt;p&gt;Obrigado pelo seu tempo!&lt;/p&gt;

&lt;p&gt;Compartilhem com seus colegas de estudo/trabalho.&lt;br&gt;
Me chama nas redes sociais a baixo para trocarmos uma ideia e tirar dúvidas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/matskira"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/matheuspoda/"&gt;LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/devmpoda"&gt;Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/@devmpoda/videos"&gt;YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Até a próxima!&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>java</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>Aprenda a medir se sua API pode ser considerada REST 🔥</title>
      <dc:creator>Matheus Poda</dc:creator>
      <pubDate>Tue, 20 Jun 2023 12:54:35 +0000</pubDate>
      <link>https://forem.com/devmpoda/aprenda-a-medir-se-sua-api-pode-ser-considerada-rest-33e8</link>
      <guid>https://forem.com/devmpoda/aprenda-a-medir-se-sua-api-pode-ser-considerada-rest-33e8</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Atire a primeira pedra quem nunca entrou em uma empresa, onde sua primeira atividade é adicionar uma nova feature na tal "API REST", mas ao abrir o código do projeto você se depara com um:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;POST /client/infos/update-infos&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ou pior&lt;/p&gt;

&lt;p&gt;&lt;code&gt;POST /client/infos/delete-infos&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;É triste mais é a realidade, existem vários sistemas que se consideram REST, mas não são.&lt;/p&gt;




&lt;h2&gt;
  
  
  Passando pelas leis do REST
&lt;/h2&gt;

&lt;p&gt;Quando falamos que uma API é REST, significa que desenvolvemos uma aplicação de transporte de informações que utiliza HTTP, porém com regras claras criadas por Roy Fielding. &lt;br&gt;
Caso você siga &lt;strong&gt;TODAS&lt;/strong&gt; a risca, pode ser considerada uma API RESTful.&lt;/p&gt;

&lt;p&gt;Fiz uma tabelinha com as leis do REST:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--niEvdA_P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ajke1te8pqfmak3ia0kc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--niEvdA_P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ajke1te8pqfmak3ia0kc.png" alt="Lista de regras REST" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Caso você ainda tenha dúvida sobre elas, recomendo fortemente, ler o  próprio &lt;a href="https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm"&gt;artigo do Roy Fielding&lt;/a&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Medindo a maturidade de sua API
&lt;/h2&gt;

&lt;p&gt;Beleza, já sabemos quais regras que devemos implementar para de fato termos uma API RESTful, mas o que você vai perceber que no dia a dia de trabalho, raramente vai encontrar tudo isso implantado.&lt;br&gt;
Normalmente não vemos por conta da relação tempo x custo, por conta disso quase sempre você irá encontrar outro tipo de padrão no mercado.&lt;/p&gt;

&lt;p&gt;Mas, como podemos medir se a API que estamos criando, ou atuando, é REST? &lt;/p&gt;

&lt;p&gt;Para isso o desenvolvedor Leonard Richardson, criou o RMM (Richardson Maturity Model), dessa forma dividimos alguns padrões do REST em 3 níveis.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zEISdJv8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d76t42619q5vqc2zca3m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zEISdJv8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d76t42619q5vqc2zca3m.png" alt="RMM - 3 Níveis" width="673" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vou explicar cada nível para vocês.&lt;/p&gt;


&lt;h2&gt;
  
  
  Os 3 níveis para a glória REST
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Nível 0: POX&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nesse nível, consideramos que API só serve mesmo como transporte de informação, não utiliza corretamente URI, verbos HTTP, HATEOAS e status code, nem possui padrão de formato representacional (JSON, XML e etc).&lt;/p&gt;

&lt;p&gt;Podendo ter casos, onde a mensagem de erro nos retorna código 200, e vem no corpo da resposta, o erro que pode ter ocorrido no 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;HTTP/1.1 200 OK
[headers]

&amp;lt;compraDeProutosErro&amp;gt;
  &amp;lt;produto descricao="teclado mecânico" id="0293"/&amp;gt;
  &amp;lt;cliente cpf = "xxxxxxxxxxxxx"/&amp;gt;
  &amp;lt;reason&amp;gt;Produto esgotado.&amp;lt;/reason&amp;gt;
&amp;lt;/compraDeProutosErro&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Nível 1: Recursos&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nesse ponto sua API já está trabalhando corretamente com URI para manipular seus recursos, mas ainda não implementa verbos HTTP, HATEOAS e status code corretamente.&lt;/p&gt;

&lt;p&gt;Aqui já começa a ser comum de encontrar por aí, já encontrei várias dessas em alguns projetos de mercado.&lt;/p&gt;

&lt;p&gt;Continuam utilizando os verbos GET e POST para realizar consultas e operações.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nível 2: Verbos HTTP&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Finalmente começamos a encontrar o uso correto das URI, verbos HTTP e status code. Para o padrão que encontramos, aqui existe um debate muito discutido.&lt;/p&gt;

&lt;p&gt;Alguns programadores não consideram o nível 2 como uma API REST, já que não há o HATEOAS, já outros consideram. Com minha experiência e minha opinião, aqui coloco que sim, já considero uma API REST a partir desse ponto.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nível 3: HATEOAS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;HATEOAS, significa Hypertext As The Engine Of Application State, um nome feio e enorme, praticamente chamamos de Hypermedia Controls.&lt;/p&gt;

&lt;p&gt;Para entender, vamos a um exemplo, imagine uma página HTML, onde temos diversos links que chamam para outros HTML. Fica vísivel qual caminho podemos adotar para vermos, por exemplo, informações de um produto, da conta e etc.&lt;/p&gt;

&lt;p&gt;A mesma coisa vale para a API, quando realizamos uma requisição, no retorno dela, deve ter alguns endpoints para ajudar ao usuário a explorar outros recursos.&lt;/p&gt;

&lt;p&gt;Vamos a um exemplo, imagine que quero consultar um produto:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;GET /produtos/872&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Como retorno HATOEAS, deveríamos ter uma resposta parecida com isso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP/1.1 200 OK

{
   "id":89,
   "nome":"Mouse ergonômico"
   "preco": 430,
   "links": {
      "fornecedor": "/fornecedores/23"
   }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Onde, além do retorno de uma consulta sobre um determinado produto, adicionamos um link para a URI de fornecedores, para dar um caminho e até mesmo uma ajuda para o usuário ir explorando os recursos da API.&lt;/p&gt;

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

&lt;p&gt;É muito raro encontrarmos uma aplicação que implemente o nível 3, por isso muitos desenvolvedores consideram o nível 2 como uma API REST. &lt;/p&gt;

&lt;p&gt;Perguntinha do artigo para refletir!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Você já trabalhou com mais APIs nível 3 ou 2?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Espero que tenha ficado claro e te ajude a medir a maturidade de suas API que virão pela frente. &lt;/p&gt;

&lt;p&gt;Obrigado pelo seu tempo.&lt;br&gt;
Compartilhem com seus colegas de estudo/trabalho.&lt;br&gt;
Me acompanhem em minhas redes sociais:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/matskira"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/matheuspoda/"&gt;LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/devmpoda"&gt;Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/@devmpoda/videos"&gt;YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Até a próxima!&lt;/p&gt;

</description>
      <category>api</category>
      <category>beginners</category>
      <category>architecture</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Git &amp; Github: Você sabe o que é SemVer?</title>
      <dc:creator>Matheus Poda</dc:creator>
      <pubDate>Wed, 10 May 2023 14:45:46 +0000</pubDate>
      <link>https://forem.com/devmpoda/git-github-voce-sabe-o-que-e-semver-2216</link>
      <guid>https://forem.com/devmpoda/git-github-voce-sabe-o-que-e-semver-2216</guid>
      <description>&lt;h2&gt;
  
  
  O mal do versionamento
&lt;/h2&gt;

&lt;p&gt;Você que é desenvolvedor, ou já fez algum projeto, já cansou de adicionar dependências ao seu projeto. De acordo que o projeto vai crescendo inúmeras bibliotecas/serviços vão sendo adicionados e você vai torcer com todas as forças que eles utilizem o padrão de versionamento semântico.&lt;/p&gt;

&lt;p&gt;Você vai ficar assim se não tiver um padrão no versionamento das dependências de seu projeto:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F7pq7xf00m2x2g90qkw1d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F7pq7xf00m2x2g90qkw1d.png" alt="Gato quando vê mil dependências" width="404" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Além disso, você a partir de agora, também irá começar a usar na construção de qualquer projeto, API e bibliotecas, pois é uma metodologia incrível que vai salvar você de inúmeros problemas e também ajudará sua API pública, caso vá ter uma, a se tornar ainda mais segura e controlada.&lt;/p&gt;




&lt;h2&gt;
  
  
  O que é esse padrão SemVar?
&lt;/h2&gt;

&lt;p&gt;SemVar vem de &lt;em&gt;Semantic Versioning&lt;/em&gt;, criado pelo Tom Preston-Werner, co-fundador do Github, a metodologia transforma a versão de um projeto em algo compreensível para quem está utilizando e também para quem está desenvolvendo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F56yzor2dw0xd8cc1vrm4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F56yzor2dw0xd8cc1vrm4.jpg" alt="Ilustração Semantic Versioning" width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos a um exemplo:&lt;/p&gt;

&lt;p&gt;Imagine uma API pública com a versão 1.3.4, ela foi construída já aplicando o versionamento semântico, significando que sua versão principal é 1, o 3 significa que foi feito adição de novas funcionalidades que não impactam quem já utiliza ela e o 4 são de ajustes e correções.&lt;/p&gt;

&lt;p&gt;O SemVar trata as versões da seguinte forma:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MAJOR.MINOR.PATCH&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MAJOR&lt;/strong&gt;: Só é alterada quando foi feito uma mudança que tornou a versão anterior incompatível, ou seja, o básico de configuração e funcionamento anterior foi atualizado a ponto de precisar incrementar a MAJOR;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MINOR&lt;/strong&gt;: Incrementada quando é feito uma modificação, ou adição de uma funcionalidade, que não tornou a aplicação incompatível;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PATCH&lt;/strong&gt;: Alterada quando é corrigido algo na aplicação, seja refatoração, correção de bug, mantendo a compatibilidade.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fk4cvvrsh2jx3hgoplm1m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fk4cvvrsh2jx3hgoplm1m.png" alt="Imagem descritiva do versionamento semântico" width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Especificações básicas
&lt;/h2&gt;

&lt;p&gt;Vou estar abordando alguma das especificações da utilização do SemVer, para mais informações, consulte a &lt;a href="https://semver.org" rel="noopener noreferrer"&gt;documentação oficial&lt;/a&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;O formato deve ser X.Y.Z, inteiros e nunca negativos, não se deve colocar um 0 antes de um número, por exemplo, 01, 02 e etc;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deve ser aumentado numericamente 1.9.0 -&amp;gt; 1.10.0 -&amp;gt; 1.11.0;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ao iniciar o desenvolvimento, você deve colocar como MAJOR, o valor '0', esse valor significa que é instável e pode sofrer alterações que impactem a compatibilidade a qualquer momento;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Quando a aplicação se tornar pública para uso, a versão MAJOR irá para '1', se tornando 1.0.0;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Você pode ter tags em suas versões, como beta, alpha, release e etc (1.0.0-alpha &amp;lt; 1.0.0-alpha.1 &amp;lt; 1.0.0-alpha.beta &amp;lt; 1.0.0-beta &amp;lt; 1.0.0-beta.2 &amp;lt; 1.0.0-beta.11 &amp;lt; 1.0.0-rc.1 &amp;lt; 1.0.0.). &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Dúvidas frequentes
&lt;/h2&gt;

&lt;p&gt;Algumas dúvidas que acho relevante saber:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Quando devo lançar a versão 1.0.0?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Se seu software está sendo usado em produção, ele já deve ser provavelmente 1.0.0. Se você possui uma API estável a qual usuários passaram a depender, deve ser 1.0.0. Se você está se preocupando bastante com compatibilidade com versões anteriores, já deve ser 1.0.0.&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;O que eu faço se, acidentalmente, liberar uma mudança incompatível com versões anteriores como uma versão menor (minor version)?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Assim que você perceber que quebrou a especificação de versionamento semântico, conserte o problema e lance uma nova versão menor, que corrige o problema e restaura a compatibilidade. Mesmo sob esta circunstância, é inaceitável modificar versões lançadas. Se for apropriado, documente a versão ofensiva e informe seus usuários do problema de forma que eles fiquem cientes da versão em questão.&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;O SemVer tem um limite de tamanho para string de versão?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Não, mas use o bom senso. Uma string de versão com 255 caracteres, por exemplo, provavelmente é um exagero. Porém, sistemas específicos podem definir seus próprios limites para o tamanho da string.&lt;/em&gt;&lt;/p&gt;




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

&lt;p&gt;A ideia desse tópico foi apresentar esse padrão, que é muito conhecido e usado, para que você se atente e veja se já utiliza no seu dia a dia!&lt;/p&gt;

&lt;p&gt;Quero deixar uma pergunta para vocês responderem, para até mesmo treinar o conteúdo:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;No seu dia a dia você já utiliza esse padrão? Pense e escreva um pouco sobre projetos que você atua e como é usado, ou deveria ser usado?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Obrigado pelo seu tempo. &lt;br&gt;
Compartilhem com seus colegas de estudo/trabalho. &lt;br&gt;
Me acompanhem em minhas redes sociais:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/matskira" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/matheuspoda/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Até a próxima!&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Git &amp; Github: Guia básico e boas práticas de Pull Request</title>
      <dc:creator>Matheus Poda</dc:creator>
      <pubDate>Tue, 09 May 2023 11:12:14 +0000</pubDate>
      <link>https://forem.com/devmpoda/git-github-guia-basico-e-boas-praticas-de-pull-request-f5</link>
      <guid>https://forem.com/devmpoda/git-github-guia-basico-e-boas-praticas-de-pull-request-f5</guid>
      <description>&lt;h2&gt;
  
  
  Entendendo Pull Request
&lt;/h2&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%2Fmemy29cu4pqo6mu7y5dn.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%2Fmemy29cu4pqo6mu7y5dn.png" alt="Pull Request ilustrado"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;De forma prática, o pull request é uma camada de segurança que podemos adicionar no repositório de nossos projetos, principalmente quando o repoistório é compartilhado com uma equipe.&lt;/p&gt;

&lt;p&gt;Nessa camada é empacotado os commits, com os códigos novos ou alterados de uma determinada branch, acompanhada de uma descrição do que tem dentro do pacote, para que um outro desenvolvedor com maior experiência no projeto, ou até mesmo um arquiteto, realize uma análise, antes de realizar o merge entre branches.&lt;/p&gt;

&lt;p&gt;Vamos a um exemplo:&lt;/p&gt;

&lt;p&gt;Imagine que esteja trabalhando em uma aplicação que realiza serviços de cadastro de clientes. No momento está criado apenas a funcionalidade de cadastro cliente pessoa física (PF), mas o responsável pelo negócio do sistema, trás que vai ser preciso criar a funcionalidade para cadastro cliente pessoa jurídica (PJ).&lt;/p&gt;

&lt;p&gt;Seguindo a ideia de boas práticas de desenvolvimento em repositórios, iremos estar criando uma branch a partir de desenvolvimento (desenv) com o nome "feature_cadastrar_cliente_pj", onde o desenvolvedor responsável irá começar a construir a solução.&lt;/p&gt;

&lt;p&gt;Após alguns commits, ele finalizou a implementação do negócio e deseja agora subir para o ambiente de desenvolvimento, para disponibilizar a nova versão para testes, seja automáticos de e2e (end-two-end), ou para QA's da equipe testarem.&lt;/p&gt;

&lt;p&gt;Porém, seguindo as práticas de segurança do repositório, ele precisa criar uma PullRequest, onde vai estar empacotado todos os commits, com seu código novo ou alterado, que ele realizou ao longo do processo de desenvolvimento, disponibilizando para o arquiteto do time analisar e verificar se está de acordo com as boas práticas da empresa.&lt;/p&gt;

&lt;p&gt;Após o arquiteto realizar a code review e verificar que está tudo certo, ele irá aprovar o pull request, o que por fim irá fazer com que aconteça o merge entre as branches.&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%2F6sl0ozpmhg4t6y4h4kmb.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%2F6sl0ozpmhg4t6y4h4kmb.png" alt="Diagrama mostrando o pull request na etapa de merge entre branch desenv e feature"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Importância de utilizar Pull Request
&lt;/h2&gt;

&lt;p&gt;Agora que entendemos o que é o Pull Request, vamos tentar compreender qual a importância dele:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ele ajuda a manter a qualidade do código, uma vez que os revisores podem detectar e corrigir erros antes do merge.&lt;/li&gt;
&lt;li&gt;Ajudar a documentar o histórico de desenvolvimento do projeto, fornecendo um registro de todas as alterações propostas e merges no repositório.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tendo o significado e a importância do Pull Request, precisamos dar uma rápida olhada para as boas práticas e dicas para transformar essa camada de segurança ainda mais prática e funcional.&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%2Fckmojopch62bmthucj2s.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%2Fckmojopch62bmthucj2s.png" alt="Imagem ilustrativa de desenvolvedor aguardando pull request"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Boas práticas
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Tamanho do pull request&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;É comum acontecer de acumular muitos commits em uma branch, e na hora de criar um pull request ter uma enorme quantidade de código para revisar.&lt;/p&gt;

&lt;p&gt;Isso pode gerar um enorme problema a longo prazo, de acordo com um estudo realizado pela &lt;a href="https://smartbear.com/learn/code-review/best-practices-for-peer-code-review/" rel="noopener noreferrer"&gt;Cisco&lt;/a&gt;, pode ser um código com grande chances de impacto e também pode ocorrer falha humana, já que a revisão acabará não sendo tão prática, e o processo de code review pode se tornar preguiçoso e lento.&lt;/p&gt;

&lt;p&gt;Então tome cuidado em não demorar muito para gerar um pull request! Não espere toda a funcionalidade ser desenvolvida, dependendo da complexidade, divida em pequenas partes e vá realizando a pull requests.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Título e descrição&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Assim como ao escrever um código limpo, precisamos dar nomes que façam sentido, aqui também vale. Ao criar um pull request escreva bons títulos e descrições.&lt;/p&gt;

&lt;p&gt;Aqui uma dica brilha, é possível criar templates para os pull request, usando eles toda vez que um desenvolvedor da equipe for fazer um pull request, já é adicionado um comentário padrão onde ele pode editar rapidamente apenas as partes relacionadas a alteração dele.&lt;/p&gt;

&lt;p&gt;Logo a frente irei estar abordando algumas ideias de template e como colocar em seu projeto.&lt;/p&gt;

&lt;p&gt;No caso de título, existem algumas opções, que você pode seguir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uma descrição bem resumida da funcionalidade (ou parte dela), &lt;strong&gt;adicionado recurso de consulta cliente por cpf&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;Adicionar uma tag relacionada a ação realizada no código do pacote, exemplo: [Correção], [Funcionalidade], [Refatoração], [Lançamento], [Ajustes] e etc;&lt;/li&gt;
&lt;li&gt;Caso trabalhe com aplicações de gerenciamento de tarefas, como Jira, Trello e etc, podemos colocar o id da tarefa/cartão, &lt;strong&gt;#777 [Funcionalidade] adicionado recurso de consulta cliente por cpf&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Templates de Pull Request
&lt;/h2&gt;

&lt;p&gt;Podemos criar alguns templates para deixar padronizado os comentários que os desenvolvedores irão utilizar, dessa forma poderá aumentar a produtividade tanto da criação dos pull request, como também para facilitar a vida do responsável pela code review.&lt;/p&gt;

&lt;p&gt;Exemplos de templates:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Para bugs:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Como reproduzir o bug?&lt;/span&gt;
Descrever rapidamente como ocorre o bug e qual foi a solução criada.

&lt;span class="gu"&gt;## Checklist&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Eu adicionei|atualizei|corrigi os testes unitários do projeto (Se aplicável);
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Sem erros ou avisos no console após minha alteração;
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Tirei prints do antes e depois da correção do problema.[adicionar a screenshot]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Para novas funcionalidades&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Resumo&lt;/span&gt;
Escreva um breve resumo sobre o que foi alterado no sistema.
&lt;span class="gu"&gt;## Checklist&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Eu adicionei|atualizei|corrigi os testes unitários do projeto (Se aplicável);
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Sem erros ou avisos no console após minha alteração;
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Tirei prints do antes e depois da correção do problema.[adicionar a screenshot]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Customizado&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Não é possível dar uma fórmula de bolo, já que cada padrão depende da empresa, tipo de projeto e etc, porém, podemos encontrar um exemplo mega completo de um template de Pull Request, no site &lt;a href="https://embeddedartistry.com/blog/2017/08/04/a-github-pull-request-template-for-your-projects/" rel="noopener noreferrer"&gt;Embedded Artistry&lt;/a&gt;, pode utilizar de exemplo e modificar para o seu caso.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como adicionar em seu repositório&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Tutorial para GitHub: &lt;a href="https://docs.gitlab.com/ee/user/project/description_templates.html#creating-merge-request-templates" rel="noopener noreferrer"&gt;https://docs.gitlab.com/ee/user/project/description_templates.html#creating-merge-request-templates&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tutorial para GitLab: &lt;a href="https://docs.github.com/en/github/building-a-strong-community/creating-a-pull-request-template-for-your-repository" rel="noopener noreferrer"&gt;https://docs.github.com/en/github/building-a-strong-community/creating-a-pull-request-template-for-your-repository&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tutorial para Azura DevOps: &lt;a href="https://docs.microsoft.com/en-us/azure/devops/repos/git/pull-request-templates?view=azure-devops" rel="noopener noreferrer"&gt;https://docs.microsoft.com/en-us/azure/devops/repos/git/pull-request-templates?view=azure-devops&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tutorial para Bitbucket: &lt;a href="https://confluence.atlassian.com/bitbucketserver/create-a-pull-request-808488431.html" rel="noopener noreferrer"&gt;https://confluence.atlassian.com/bitbucketserver/create-a-pull-request-808488431.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Espero que eu tenha alcançado o objetivo de te ensinar o que é Pull Request! Ao ler e testar esse tópico, você deve ser capaz de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Explicar o que é Pull Request;&lt;/li&gt;
&lt;li&gt;Qual a importância;&lt;/li&gt;
&lt;li&gt;Boas práticas;&lt;/li&gt;
&lt;li&gt;Como usar templates e para que servem.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Obrigado pelo seu tempo. &lt;br&gt;
Compartilhem com seus colegas de estudo/trabalho. &lt;br&gt;
Até a próxima!&lt;/p&gt;

</description>
      <category>github</category>
      <category>git</category>
      <category>beginners</category>
      <category>devops</category>
    </item>
    <item>
      <title>Git &amp; Github: Começando com assinatura de commits</title>
      <dc:creator>Matheus Poda</dc:creator>
      <pubDate>Thu, 04 May 2023 12:23:50 +0000</pubDate>
      <link>https://forem.com/devmpoda/git-github-comecando-com-assinatura-de-commits-37ej</link>
      <guid>https://forem.com/devmpoda/git-github-comecando-com-assinatura-de-commits-37ej</guid>
      <description>&lt;h2&gt;
  
  
  Problema de não assinar commits
&lt;/h2&gt;

&lt;p&gt;Quando começamos a trabalhar com git, a primeira coisa básica, além de instalar, é começarmos uma série de comandos para dizer quem somos nós.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.name &lt;span class="s2"&gt;"Matheus Poda"&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.email mpoda@example.com

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

&lt;/div&gt;



&lt;p&gt;Essas informações que passamos é utilizada quando realizamos commit do nosso código, dessa forma, sempre estará aparecendo seu nome e dados, para mostrar quem foi o responsável por realizar um commit no repositório.&lt;/p&gt;

&lt;p&gt;Porém, é comum burlar esses dados que passamos, quando estamos trabalhando em projetos de larga escala com diversas equipes ou até mesmo uma equipe pequena.&lt;/p&gt;

&lt;p&gt;Qualquer pessoa na equipe, pode alterar as configurações que vimos acima e colocar você ou outra pessoa, que não é responsável pelo commit, e realizar essa ação e isso pode acabar se tornando um problema de segurança.&lt;/p&gt;

&lt;p&gt;Por conta dessa possível "fraude" de autor de commit, que podemos utilizar uma forma ainda mais segura de trabalhar com Git e a plataforma de repositórios (GitHub, Bitbucket e etc), essa forma é assinando digitalmente nossos commits.&lt;/p&gt;

&lt;p&gt;Nesse breve tópico, vou estar ensinando o básico de como gerar uma assinatura e assinar commits direto no GitHub!&lt;/p&gt;




&lt;h2&gt;
  
  
  Instalação no Windows
&lt;/h2&gt;

&lt;p&gt;O primeiro passo para começar a assinar seus commits, é de fato, criar a assinatura, que é um processo de segurança, já que é feito através de chaves (&lt;em&gt;Tokens&lt;/em&gt;) criptografadas.&lt;/p&gt;

&lt;p&gt;Para criar essa chave, iremos utilizar o sistema GPG (GNU PG), que praticamente é um software open-source que trás a mesma ideia do PGP (Pretty Good Privacy), que no caso é pago. Esse software nos permite criar chaves criptografadas para uso.&lt;/p&gt;

&lt;p&gt;Nesse tópico, estarei utilizando o sistema operacional Windows, porém vou deixar mais a baixo alguns links de referência para usuários linux/mac se guiarem, normalmente o gpg nesses sistemas, já vem pré-instalado, porém no Windows é preciso instalar.&lt;/p&gt;

&lt;p&gt;Para realizar a instalação, você deve baixar o &lt;a href="https://www.gpg4win.org/get-gpg4win.html"&gt;gpg4win&lt;/a&gt;, nele vem outro sistema de criptografia junto, o Kleopatra, que pode ser útil no futuro.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---xkhKWwO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iqvnv5xgn5ngg664b14u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---xkhKWwO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iqvnv5xgn5ngg664b14u.png" alt="Configuração GPG4WIN" width="800" height="554"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Alguns tutoriais para instalação e teste do GPG nos sistemas linux/mac:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/ankurk91/c4f0e23d76ef868b139f3c28bde057fc"&gt;https://gist.github.com/ankurk91/c4f0e23d76ef868b139f3c28bde057fc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.guiafoca.org/guiaonline/seguranca/ch07s11.html"&gt;https://www.guiafoca.org/guiaonline/seguranca/ch07s11.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Criando sua chave GPG
&lt;/h2&gt;

&lt;p&gt;Tendo o gpg funcional em seu terminal de preferência, vamos começar a parte de criação da chave.&lt;/p&gt;

&lt;p&gt;O primeiro comando útil de saber é o relacionado a listar nossas chaves:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;gpg --list-secret-key --keyid-form LONG&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Para criarmos uma chave, usaremos o seguinte comando:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;gpg --full-generate-key&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--J4HZdgbY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0b92zlf5d2wg2ucp690h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--J4HZdgbY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0b92zlf5d2wg2ucp690h.png" alt="Terminal com o comando rodando" width="800" height="554"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ele irá te fazer três perguntas, para o tipo de Key, recomendo utilizar o RSA e colocar 4096 bits, também irá pedir o tempo de duração da chave e por fim irá pedir seu nome e senha (&lt;strong&gt;IMPORTANTE: Lembre-se de colocar o mesmo nome e e-mail que seu git config&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;Ele irá pedir também uma senha para você dar a chave que está criando, então não esqueça de colocar e anotar.&lt;/p&gt;




&lt;h2&gt;
  
  
  Adicionado sua chave ao GIT
&lt;/h2&gt;

&lt;p&gt;O primeiro passo é você obter o id da chave gerada, basta usar o comando que apresentei, você irá ver algo como:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3UteQRFb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dfygnau4m99zdw5p02bo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3UteQRFb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dfygnau4m99zdw5p02bo.png" alt="Exemplo chave" width="377" height="43"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para adicionar a assinatura que você acabou de ver pelo comando de listagem, utilizaremos o seguinte comando&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git config --global user.signingkey xxxx&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;xxx *&lt;/em&gt;-&amp;gt; sua chave&lt;/p&gt;

&lt;p&gt;Além disso, precisamos deixar claro que iremos querer assinar nossos commits a partir de agora com a chave gerada:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git config --local commit.gpgsign true&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lembrando que no comando, --local apenas no diretório que você está seu commit será assinado se quiser que sempre seja, independente do repositório (o que não indico), basta colocar --global.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Adicionando chave no GitHub
&lt;/h2&gt;

&lt;p&gt;Para adicionar no github, você precisará da chave pública, obteremos através do seguinte comando: &lt;br&gt;
&lt;code&gt;gpg --armor --export&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ele irá gerar uma sequência de caracteres gigante, você irá copiar do "--BEGIN PGP PUBLIC KEY BLOCK" até o "END PGP KEY BLOCK", incluindo esses caracteres.&lt;/p&gt;

&lt;p&gt;Tendo eles em mãos, iremos entrar no github e ir até os settings, selecionar "SSH and GPG Keys" e iremos clicar no botão "New GPG Key", lá você deverá colar o que copiou lá no terminal.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EgEjR_vZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ehkl9ab9mqjzu2cu2ki6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EgEjR_vZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ehkl9ab9mqjzu2cu2ki6.png" alt="Key no github" width="800" height="391"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Realizando um commit assinado
&lt;/h2&gt;

&lt;p&gt;Agora com tudo configurado e já tendo uma chave vinculada ao GitHub e no seu Git, realizaremos um commit assinado.&lt;/p&gt;

&lt;p&gt;Primeiro, vou criar um repositório para realizarmos um commit:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jEIE3QMj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/59sfzrwvnaya3flztbqv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jEIE3QMj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/59sfzrwvnaya3flztbqv.png" alt="GitHub Repository" width="800" height="292"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6awxBRcL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fndrcmksu6syhtxushqa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6awxBRcL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fndrcmksu6syhtxushqa.png" alt="Diretório do projeto" width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vou criar um arquivo index.html, para realizar um commit:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SCPAH383--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k3cayu4c3g8nqko864dt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SCPAH383--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k3cayu4c3g8nqko864dt.png" alt="Arquivo index.html" width="800" height="599"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora vamos realizar o commit assinado:&lt;/p&gt;

&lt;p&gt;1- Vou estar ativando a configuração para obrigar assinatura nesse repositório:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Trh1FyNJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lso42tb88641ftwcsaqy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Trh1FyNJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lso42tb88641ftwcsaqy.png" alt="Ativando assinatura no repo" width="575" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2- Realizar o commit assinado:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git commit -S -m "First Commit!"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Colocamos o &lt;strong&gt;-S&lt;/strong&gt; para dizer que é assinado, e posteriormente ele irá abrir a tela para colocar a senha que criamos quando geramos a chave.&lt;/p&gt;

&lt;p&gt;3- Verificando no GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uwx0w9qy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kvpt0vz1y7r0cx3zrskm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uwx0w9qy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kvpt0vz1y7r0cx3zrskm.png" alt="Commit assinado" width="800" height="211"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como podemos ver, ao lado do commit que realizamos está com a tag 'verified', que demonstra que foi de fato assinado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--f7Em5b1T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gyhqnu8pa0b6mquhh0fq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--f7Em5b1T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gyhqnu8pa0b6mquhh0fq.png" alt="Verified Commit" width="301" height="254"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Espero que tenha sido claro e agora você irá assinar seus commits e ter um projeto ainda mais seguro!!&lt;/p&gt;

&lt;p&gt;Se você curtiu, não esqueça de salvar esse artigo e compartilhar com o pessoal da sua equipe! &lt;/p&gt;

&lt;p&gt;Obrigado pelo seu tempo.&lt;/p&gt;




&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.git-tower.com/blog/setting-up-gpg-windows/"&gt;https://www.git-tower.com/blog/setting-up-gpg-windows/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codex.so/gpg-verification-github"&gt;https://codex.so/gpg-verification-github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/pt/authentication/managing-commit-signature-verification/signing-commits"&gt;https://docs.github.com/pt/authentication/managing-commit-signature-verification/signing-commits&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>git</category>
      <category>devops</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Como usar Java Stream API?</title>
      <dc:creator>Matheus Poda</dc:creator>
      <pubDate>Thu, 19 Jan 2023 12:02:00 +0000</pubDate>
      <link>https://forem.com/devmpoda/como-usar-java-stream-api-1jd6</link>
      <guid>https://forem.com/devmpoda/como-usar-java-stream-api-1jd6</guid>
      <description>&lt;p&gt;Progressivamente mais, vem se tornando um requisito obrigatório criar soluções com processamento rápido, que lidam bem com paralelismo para desenvolver um backend de qualidade, confiabilidade e escalabilidade. &lt;/p&gt;

&lt;p&gt;Por consequência um modelo “novo” (que na verdade é extremamente antigo, já que sua existência pelo que sabe originou-se em 1950 e já era usada no velho Lisp), chamado de programação funcional, vem sendo muito utilizado, por isso novas tecnologias aparecem com esse paradigma como base e outras adicionam suporte a ela (JavaScript, Python, Ruby e etc).&lt;/p&gt;

&lt;p&gt;O Java não seria diferente, em março de 2014 foi lançada a versão 8, contando com inúmeras mudanças e o início do suporte ao arquétipo funcional, com novas construções, a adição de expressões lambda, bibliotecas para trabalhar com coleções e também data e hora.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que é o Stream API?
&lt;/h3&gt;

&lt;p&gt;Uma dessas adições foi a interface Stream, que veio para melhorar mais as operações com coleções, já que possui vários métodos. &lt;/p&gt;

&lt;p&gt;Por exemplo:&lt;/p&gt;

&lt;p&gt;Imagine uma lista numérica, onde você deseja imprimir no console apenas números pares, antes do Java 8, provavelmente seria utilizado o seguinte algoritmo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fodbsgjlovu2b6tl6w5q5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fodbsgjlovu2b6tl6w5q5.png" alt="Image description" width="800" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Você possivelmente utilizaria o foreach para realizar a iteração, porém com essa nova Interface, podemos fazer em apenas duas linhas:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F04it9vcgyu87ya1sifjn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F04it9vcgyu87ya1sifjn.png" alt="Image description" width="800" height="259"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Onde usamos o método stream, para realizar a chamada da interface e usamos o método intermediário “filter()”, passando uma função lambda para filtrar por pares e por fim chamamos um método terminal, para realizar uma determinada operação, que no caso é apenas um “System.out.println”, para exibir no console.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefícios de seu uso&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Torna seu código conciso;&lt;/li&gt;
&lt;li&gt;Diminuição e facilitação de leitura;&lt;/li&gt;
&lt;li&gt;Fácil de realizar manutenção;&lt;/li&gt;
&lt;li&gt;Não precisa se preocupar com processamento em si, já que o Stream é responsável por iterar, não sua lógica;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Lembre-se:&lt;/strong&gt; Por seguir o paradigma funcional, não se pode esquecer da imutabilidade, isto é, o Stream não irá “modificar” a coleção que está sendo utilizada. Por exemplo, se no caso de, ao invés de listar, queremos salvar na lista apenas os números pares, obrigatoriamente você terá que criar um novo objeto;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como funciona a stream&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Stream por definição no Java, é uma “sequência de elementos de uma fonte de dados que oferece suporte a diferentes tipos de operações de agregação”. Ela é uma interface para operarmos com um conjunto de elementos sequenciais de um determinado tipo.&lt;br&gt;
Mas atenção, o Stream não armazena dados, serve para ser esse fluxo de operações para um resultado final.&lt;br&gt;
Imagine o seguinte código de uma coleção usando Streams:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fn4ubtsvwo5sq80dkj326.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fn4ubtsvwo5sq80dkj326.png" alt="Image description" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O fluxo de funcionamento de uma Stream é a seguinte:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fglsu9vi60m21pnfsqpau.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fglsu9vi60m21pnfsqpau.png" alt="Image description" width="556" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se inicia com o dado de origem, que normalmente será uma coleção de itens e irá passar pelo pipeline (conjunto de métodos que fazem operações básicas), por fim irá gerar um resultado através de um dado terminal (que retorna algo que não seja um Stream).&lt;br&gt;
Lembre-se que os dados na stream seguem um paradigma funcional, a cada método usado na pipeline irá gerar uma nova stream.&lt;/p&gt;

&lt;p&gt;O stream possui dois tipos de operação, &lt;strong&gt;operações intermediárias (sorted, filter, map e distinct) e operações terminais (forEach, average, collect e allMatch).&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Vamos entender qual a responsabilidade de cada uma delas, quais métodos mais importantes fazem parte delas.&lt;/p&gt;




&lt;h3&gt;
  
  
  Operações Intermediárias
&lt;/h3&gt;

&lt;p&gt;São os métodos usados para realizar operações que podem modificar o resultado final, aqui encontramos comparadores, ordenadores, modificadores e etc.&lt;br&gt;
Para todos os exemplos, usaremos o objeto Fruta, que é a representação abstrata de uma fruta:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F1dh5ff57gzqmkmj9szq6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F1dh5ff57gzqmkmj9szq6.png" alt="Image description" width="800" height="593"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sorted&lt;/strong&gt;&lt;br&gt;
Como o nome sugere, utilizamos para ordenar a stream. Com ele pode ordenar de uma forma específica utilizando, por exemplo, a interface Comparator.&lt;/p&gt;

&lt;p&gt;Exemplo de uso:&lt;/p&gt;

&lt;p&gt;Imagine que eu tenho um carrinho de compras de uma feira de frutas, e eu decido ordenar em ordem alfabética.&lt;br&gt;
Podemos utilizar o sorted, passando a interface Comparator, com o tipo de dado que iremos ordenar, no caso por ser uma String, vai se tornar alfabético.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fs4pq4xny39qw483syr40.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fs4pq4xny39qw483syr40.png" alt="Image description" width="800" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No console irá ficar:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fzme5f72vjzxtq1dzjm62.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fzme5f72vjzxtq1dzjm62.png" alt="Image description" width="800" height="807"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Filter&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O método filter é muito útil no dia a dia, quando trabalhamos com consultas, ou queremos filtrar qualquer tipo de dado.&lt;br&gt;
Ele recebe como parâmetro uma interface funcional (Predicate) que define uma função onde precisamos devolver um boolean. Dessa forma iremos receber como retorno uma nova stream que foi filtrada por nosso predicate.&lt;br&gt;
Exemplo de uso:&lt;/p&gt;

&lt;p&gt;Temos um carrinho de compras de frutas e desejamos apenas frutas que começam com a letra A.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fdns0sqh9gowq8792eelr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fdns0sqh9gowq8792eelr.png" alt="Image description" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No console irá ficar:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Flf11mwcnhqyg52g6f590.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Flf11mwcnhqyg52g6f590.png" alt="Image description" width="800" height="633"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Map&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Quando necessitamos fazer algumas transformações em alguma coleção de dados, o método map é o ideal.&lt;br&gt;
Assim como o filter, ele também possui como argumento uma interface funcional que é o Function.&lt;br&gt;
Essa função irá pegar todos os elementos da stream como parâmetro e depois irá retornar os elementos que passaram pelo processo, em uma nova stream.&lt;/p&gt;

&lt;p&gt;Exemplo de uso:&lt;/p&gt;

&lt;p&gt;No meu carrinho de frutas, descobri que preciso adicionar a palavra “fruta-”, antes do nome das frutas. Podemos utilizar o map para modificar os itens:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fr0f2v36308dsnv1hr6cl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fr0f2v36308dsnv1hr6cl.png" alt="Image description" width="800" height="319"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No console irá ficar:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F6l48idxpevylksnvn2jm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F6l48idxpevylksnvn2jm.png" alt="Image description" width="800" height="807"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Distinct&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A ideia é ser igual ao da linguagem SQL, retorna uma nova stream contendo elementos não repetidos, porém tem um detalhe, os itens da coleção que você está utilizando, precisam ter o método equals implementado, pois ele usa ele para realizar o algoritmo.&lt;/p&gt;

&lt;p&gt;Exemplo de uso:&lt;/p&gt;

&lt;p&gt;Imagine que no seu carrinho de compras, você não quer que tenha duas frutas iguais, caso o cliente esteja comprando duas, haverá uma variável de quantidade que irá computar.&lt;/p&gt;

&lt;p&gt;Primeiro, para usarmos o distinct, adicionaremos os métodos hashcode e equals em nosso objeto Fruta:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fm8k8bjsbmu66ok0wolw4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fm8k8bjsbmu66ok0wolw4.png" alt="Image description" width="800" height="475"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora, aplicando o distinct:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F022c309t1udthpv1w1k0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F022c309t1udthpv1w1k0.png" alt="Image description" width="800" height="305"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No console fica:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fde35pm40qcpx6i43uhbs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fde35pm40qcpx6i43uhbs.png" alt="Image description" width="800" height="524"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Operações terminais
&lt;/h3&gt;

&lt;p&gt;São métodos finais do fluxo Stream, usado para te retornar um resultado diferente de uma nova stream, como no caso dos intermediários (List, String, Long, Integer e etc).&lt;/p&gt;

&lt;p&gt;Seus métodos mais importantes são:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ForEach&lt;/strong&gt;&lt;br&gt;
Assim como o foreach original do Java, ele segue a mesma ideia, nele é possível realizar um loop em todos os elementos e realizar algum tipo de processamento.&lt;br&gt;
Exemplo de uso:&lt;br&gt;
Até agora usei praticamente em todos os exemplos das operações intermediárias, para poder imprimir no console as frutas, praticamente essa é a ideia, ele permite receber funções lambda.&lt;br&gt;
No exemplo, usei o println:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Frhc0lp9a26ai9zr2a95k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Frhc0lp9a26ai9zr2a95k.png" alt="Image description" width="800" height="195"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Average&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;É utilizado para calcularmos a média de valores de um elemento. Considerado uma operação de redução, já que ele irá retornar um único elemento.&lt;/p&gt;

&lt;p&gt;Exemplo de uso:&lt;/p&gt;

&lt;p&gt;Vamos adicionar mais uma propriedade no objeto Fruta, será o de “preço”:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fqrqq418vpcvil4fgf2e8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fqrqq418vpcvil4fgf2e8.png" alt="Image description" width="800" height="305"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora imagine o seguinte caso, no carrinho de compras, com o preço agora, queremos saber a média gasta pelo cliente ficando da seguinte forma:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F0vieod5zr5821urt1akz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F0vieod5zr5821urt1akz.png" alt="Image description" width="800" height="282"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No console fica:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Forq2hqgv9frhpynh3fi5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Forq2hqgv9frhpynh3fi5.png" alt="Image description" width="800" height="151"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Collect&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Método que possibilita obtermos os itens da Stream que estamos mexendo e transformarmos em coleções (List, Set e Map). Normalmente colocamos como argumento o Collectors (exemplo em uma lista, “Collector.toList()”).&lt;/p&gt;

&lt;p&gt;Exemplo de uso:&lt;/p&gt;

&lt;p&gt;Imagine que eu queira trabalhar com apenas frutas que começam com a letra “M” e decido criar uma nova lista com elas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fyog7i4ma0ai3xu9gfn1u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fyog7i4ma0ai3xu9gfn1u.png" alt="Image description" width="800" height="236"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No console fica:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fe3f1iimqlcvf5by5a2y2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fe3f1iimqlcvf5by5a2y2.png" alt="Image description" width="800" height="156"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Count&lt;/strong&gt;&lt;br&gt;
Assim como o size das coleções, esse método irá retornar quantos elementos temos em uma stream. Retornar um único valor.&lt;/p&gt;

&lt;p&gt;Exemplo de uso:&lt;/p&gt;

&lt;p&gt;Usando o exemplo anterior, irei querer saber ao invés da lista de frutas, apenas quantos tem:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fahgk9ld3y2h4t43eubpu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fahgk9ld3y2h4t43eubpu.png" alt="Image description" width="800" height="215"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No console fica:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fngw3z8qx6iseozwxeq8e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fngw3z8qx6iseozwxeq8e.png" alt="Image description" width="800" height="136"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AllMatch&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Esse método é responsável por garantir se todos os elementos estão de acordo com uma condição. Assim como o filter, ele recebe a interface funcional Predicate, com a função, assim ele irá retornar um boolean.&lt;/p&gt;

&lt;p&gt;Exemplo de uso:&lt;/p&gt;

&lt;p&gt;Por exemplo, se eu utilizar ele na minha lista de frutas original, ele deve retornar false, pois, nem todas começam com a letra “M”:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fmm41xjelex1vnmaydu6p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fmm41xjelex1vnmaydu6p.png" alt="Image description" width="800" height="215"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No console:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fbgtgewj3jj0hf4ubuz8s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fbgtgewj3jj0hf4ubuz8s.png" alt="Image description" width="800" height="136"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora se filtrarmos:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fhe7r0n5vmb06mmwmwn2h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fhe7r0n5vmb06mmwmwn2h.png" alt="Image description" width="800" height="255"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No console fica:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fgtozs4eugk9vtjb1tiiv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fgtozs4eugk9vtjb1tiiv.png" alt="Image description" width="800" height="136"&gt;&lt;/a&gt;&lt;/p&gt;




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

&lt;p&gt;O Stream do Java veio para ajudar ainda mais nós desenvolvedores, através do seu fluxo de desenvolvimento, com uma variável de origem, seguida de métodos intermediários (pipeline) que irão gerar novas versões da Stream e finalizamos com um método terminal para gerar o resultado que queremos.&lt;/p&gt;

&lt;p&gt;Espero que tenha ficado claro o uso dessa API incrível, agora não se esqueça de aplicar em seus projetos e se tornar um desenvolvedor com um código cada vez melhor!&lt;/p&gt;

</description>
      <category>replit</category>
      <category>discuss</category>
      <category>ui</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Como usar melhor a API Java Collection</title>
      <dc:creator>Matheus Poda</dc:creator>
      <pubDate>Wed, 04 Jan 2023 12:03:00 +0000</pubDate>
      <link>https://forem.com/devmpoda/como-usar-melhor-a-api-java-collection-35i0</link>
      <guid>https://forem.com/devmpoda/como-usar-melhor-a-api-java-collection-35i0</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Como desenvolvedor Java, sempre tive uma alta demanda de estudos práticos e isso acabou me gerando diversas dúvidas ao longo da minha carreira.&lt;/p&gt;

&lt;p&gt;Então, após finalizar minha faculdade de Engenharia da Computação, desejei voltar desde os fundamentos e estudar, me aprofundando em cada ponto da linguagem de programação Java, respondendo dúvidas comuns que ficavam em minha cabeça.&lt;/p&gt;

&lt;p&gt;Nesse artigo irei explicar o que é o Java Collection, já dando spoiler, também irei explicar qual o motivo de usar essa API incrível do Java e quando usar cada uma das principais estruturas de dados que ela trata através de suas incríveis interfaces.&lt;/p&gt;




&lt;h2&gt;
  
  
  O que é a Java Collection?
&lt;/h2&gt;

&lt;p&gt;É uma API Java, que fornece a nós desenvolvedores, um conjunto de classes e interfaces para armazenarmos, acessarmos e manipularmos um conjunto dinâmico de objetos (precisa ser objetos, os métodos não aceitam tipos primitivos, então caso precise de uma lista de inteiros, por exemplo, você irá utilizar &lt;strong&gt;Integer&lt;/strong&gt; e não &lt;strong&gt;int&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;Dessa forma tratamos esse conjunto de dados como uma coleção, que por sinal é o nome da interface base da API, o Collection. Essa API possui uma enorme gama de interfaces interligadas com métodos para realizar as operações já citadas.&lt;/p&gt;




&lt;h2&gt;
  
  
  Por que usar?
&lt;/h2&gt;

&lt;p&gt;A resposta é bem simples, temos vários motivos, os mais essenciais no meu ponto de vista, são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Reuso das Interfaces disponíveis;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Entendimento do código, já que na maioria esmagadora dos casos, implementamos o Java Collection em nossa aplicação, sendo muito mais simples e fácil de entender seu uso como sua performance, ao invés de algoritmos escritos de forma própria;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Boa qualidade, pois como havia dito, é extremamente utilizada em projetos, então foi submetida a muitos testes;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Hierarquia da API
&lt;/h2&gt;

&lt;p&gt;Na API possuímos uma grande quantidade de interfaces e classes feitas para disponibilizar métodos e gerenciamento através de objetos, temos vários casos de colecionamento de objetos.&lt;/p&gt;

&lt;p&gt;Como mostra a hierarquia abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MqXkWV9p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y31ww8qjpgr1wk1f293c.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MqXkWV9p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y31ww8qjpgr1wk1f293c.jpg" alt="Diagrama mostrando a hierarquia do Java Collection API" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No caso do Map, mesmo que ele não esteja na Coleção em si, ele pertence a esse pacote de utils do Java e pode ser usado da mesma forma.&lt;/p&gt;

&lt;p&gt;Através dessas interfaces, podemos criar listas (list), conjuntos (set), mapas (map), filas (queue), Stack (pilha) e etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quais são as interfaces mais comuns?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  List
&lt;/h3&gt;

&lt;p&gt;Visão geral sobre essa interface, que é a mais utilizada da API:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Objetos ordenados;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pode conter elementos duplicados;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Indexado, podemos ter controle sobre o local do elemento;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Muito parecido com o Array comum, mas ele é dinâmico;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As classes mais utilizadas em implementação é o ArrayList e o LinkedList;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NJXqD5ST--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ndg9xerg87ve0fmyfgax.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NJXqD5ST--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ndg9xerg87ve0fmyfgax.png" alt="Ilustração do list" width="584" height="159"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em que momento utilizar essa interface:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Quando precisaremos fazer acessos aleatórios, já que ela é indexada;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Caso exista a chance de ter elementos duplicados na sua coleção;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ArrayList VS LinkedList:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ArrayList&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Precisa fazer consultas mais vezes pelo índice;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Não precisa de inserções e remoções constantes.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;LinkedList&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Consultas frequentes pelo início e fim da coleção;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Precisa fazer inserções e remoções constantes;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lista com um tamanho significante.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplo de chamada:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ArrayList&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dmRKolvq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l1jeylqaascd06frknwx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dmRKolvq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l1jeylqaascd06frknwx.png" alt="Instancia de uma List com ArrayList" width="596" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LinkedList&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RvDDhqrV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tilg0qn0h4r395d7nqy6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RvDDhqrV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tilg0qn0h4r395d7nqy6.png" alt="Instancia de uma List com LinkedList" width="487" height="316"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Set
&lt;/h3&gt;

&lt;p&gt;Visão geral sobre a interface Set:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Não permite elementos duplicados, elementos únicos;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Trabalha com representações de conjuntos matemáticos;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Não é indexada;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_XKRpsuy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v9npimybo0q9ppcesav5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_XKRpsuy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v9npimybo0q9ppcesav5.png" alt="Set imagem" width="597" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Utilizamos essa interface, quando precisamos montar uma coleção sem elementos duplicados:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Quando possui um sistema que cadastrará usuários únicos no sistema.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Para armazenamento de números únicos em algoritmos.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Suas implementações são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;HashSet: Elementos únicos, mas sem ordenação, consulta rápida;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TreeSet: Elementos classificados em ordem natural, consulta um pouco mais lenta que o HashSet;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;LinkedHashSet: Mantém uma lista duplamente ligada através de seus itens. Seus elementos são integrados na ordem em que foram inseridos. Como por exemplo uma corrida de fórmula 1, onde temos que armazenar as colocações;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplo de chamada&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HashSet&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--S11yXzvh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d2nd505veh35qd0hpq58.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--S11yXzvh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d2nd505veh35qd0hpq58.png" alt="Instancia de um Set com HashSet" width="800" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TreeSet&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ScQLqPjb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hjxn2jeupfvubrm9wzp6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ScQLqPjb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hjxn2jeupfvubrm9wzp6.png" alt="Instancia de um Set com TreeSet" width="800" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LinkedHashSet&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZMEJ8CRX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a501tle4zck6xxn7buwf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZMEJ8CRX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a501tle4zck6xxn7buwf.png" alt="Instancia de um Set com LinkedHashSet" width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Map
&lt;/h3&gt;

&lt;p&gt;Visão geral sobre a interface Map:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Mapeamento chave-valor;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Não pode repetir mesma chave, mas podemos ter chaves diferentes com o mesmo valor;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Dd3pl748--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a3i7xmgv4x5j8mrga463.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Dd3pl748--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a3i7xmgv4x5j8mrga463.png" alt="img de ex map" width="471" height="251"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Utilizamos o Map quando precisamos da interação de chave-valor, como na classe Properties, ou até mesmo quando queremos montar os query params de uma chamada e precisamos passar o nome da variável e o valor dela.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1Wi-RQtp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/btyqw3lplzczje5ku6fi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1Wi-RQtp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/btyqw3lplzczje5ku6fi.png" alt="img de ex map" width="603" height="195"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Suas implementações&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;HashMap: Permite chaves e valores null, não possui garantia de ordenação;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TreeMap: Garantia de ordenação em ordem crescente pela chave, mas pode ser alterado, usado quando queremos nosso map ordenado;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplos de chamada:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HashMap&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WOtyZXuX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xxfv3c5li0kd2x5yhvlp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WOtyZXuX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xxfv3c5li0kd2x5yhvlp.png" alt="Map com HashMap" width="800" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TreeMap&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6Om5w-wK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hq2khubcwwzuxxgb1wp7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6Om5w-wK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hq2khubcwwzuxxgb1wp7.png" alt="Map com TreeMap" width="800" height="462"&gt;&lt;/a&gt;&lt;/p&gt;




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

&lt;p&gt;Espero que tenha ficado claro em que momento usar cada uma das interfaces e suas implementações, é extremamente importante entender as ferramentas que temos disponíveis em nossas mãos, para criar um código de qualidade e logicamente mais efetivo.&lt;/p&gt;

&lt;p&gt;Estarei disponibilizando uma tabela resumida sobre o assunto explicado:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--coA-f2-2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/un19bu7fjrkc0r28p6iy.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--coA-f2-2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/un19bu7fjrkc0r28p6iy.jpeg" alt="diagrama uso de collection basico" width="800" height="912"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Também meu repositório com exemplos dos métodos das implementações citadas. &lt;a href="https://github.com/matskira/mpoda-java-collection"&gt;Link do git&lt;/a&gt;&lt;br&gt;
Caso queira se aprofundar mais, nada melhor que a documentação oficial: &lt;a href="https://docs.oracle.com/javase/tutorial/collections/implementations/index.html"&gt;Documentação Oracle&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Obrigado por terem ficado até aqui, e lembre-se que a jornada é uma montanha, é difícil subir, mas quando se está no topo, a vista é incrível.&lt;/p&gt;

&lt;p&gt;Até a próxima.&lt;/p&gt;

&lt;p&gt;Referências:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.digitalocean.com/community/tutorials/collections-in-java-tutorial"&gt;https://www.digitalocean.com/community/tutorials/collections-in-java-tutorial&lt;/a&gt; &lt;a href="https://www.javatpoint.com/collections-in-java"&gt;https://www.javatpoint.com/collections-in-java&lt;/a&gt; &lt;a href="https://www.devmedia.com.br/java-collections-como-utilizar-collections/18450"&gt;https://www.devmedia.com.br/java-collections-como-utilizar-collections/18450&lt;/a&gt; &lt;a href="https://www.quora.com/What-are-the-most-important-Java-collections-to-use"&gt;https://www.quora.com/What-are-the-most-important-Java-collections-to-use&lt;/a&gt; &lt;a href="https://stackoverflow.com/questions/21974361/which-java-collection-should-i-use"&gt;https://stackoverflow.com/questions/21974361/which-java-collection-should-i-use&lt;/a&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
