<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ana Laura</title>
    <description>The latest articles on DEV Community by Ana Laura (@analaura).</description>
    <link>https://dev.to/analaura</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%2F827608%2Fa040b927-39a9-4b6e-a81b-bf426ebe9c51.jpg</url>
      <title>DEV Community: Ana Laura</title>
      <link>https://dev.to/analaura</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/analaura"/>
    <language>en</language>
    <item>
      <title>O que é um Perceptron — ou pelo menos o que eu entendi sobre ele</title>
      <dc:creator>Ana Laura</dc:creator>
      <pubDate>Mon, 30 Jun 2025 01:56:50 +0000</pubDate>
      <link>https://dev.to/analaura/o-que-e-um-perceptron-ou-pelo-menos-o-que-eu-entendi-sobre-ele-5bgd</link>
      <guid>https://dev.to/analaura/o-que-e-um-perceptron-ou-pelo-menos-o-que-eu-entendi-sobre-ele-5bgd</guid>
      <description>&lt;p&gt;E aí, cês tão bem?&lt;/p&gt;

&lt;p&gt;Hoje, quero trocar uma ideia sobre o tal do neurônio artificial, mostrar como ele pensa, erra, aprende e, no fim, toma decisões sozinho.&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%2Fmmsnxuqvn6ouv1oovxj5.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%2Fmmsnxuqvn6ouv1oovxj5.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Mas o que é um perceptron?
&lt;/h2&gt;

&lt;p&gt;Um perceptron é o modelo mais simples de uma rede neural. Ele é tipo um neurônio artificial que já consegue tomar decisões do tipo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sim ou não&lt;/li&gt;
&lt;li&gt;1 ou 0&lt;/li&gt;
&lt;li&gt;curte ou não curte&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A ideia é: ele recebe algumas informações (as chamadas entradas), faz uma conta e toma uma decisão. Mas, assim como a gente, ele só consegue decidir bem depois de aprender ou seja, errando, ajustando, errando de novo… até acertar.&lt;/p&gt;

&lt;h3&gt;
  
  
  Entradas e decisões
&lt;/h3&gt;

&lt;p&gt;Essas entradas podem ser qualquer coisa: quantas curtidas um post teve, se a pessoa gosta de dançar, se ela vai em baile... o que for.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Entrada&lt;/strong&gt;: gosta de dançar? → x1&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Entrada&lt;/strong&gt;: vai em baile? → x2&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Exemplo prático: quem curte funk?
&lt;/h2&gt;

&lt;p&gt;Imagina que a gente quer ensinar um perceptron a dizer se a pessoa curte funk com base em duas perguntas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gosta de dançar? (x1)&lt;/li&gt;
&lt;li&gt;Vai em baile? (x2)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se a resposta for sim, a entrada é 1. Se for não, é 0.&lt;/p&gt;

&lt;h3&gt;
  
  
  A matemática por trás da decisão
&lt;/h3&gt;

&lt;p&gt;A conta que o perceptron faz é essa aqui:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x1&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;w1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;w2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Onde:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;x1&lt;/code&gt;, &lt;code&gt;x2&lt;/code&gt; são as entradas (ex: gosta de dançar, vai em baile)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;w1&lt;/code&gt;, &lt;code&gt;w2&lt;/code&gt; são os pesos, que mostram o quanto cada entrada é importante&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;b&lt;/code&gt; é o bias (viés), um ajuste fino pra linha de decisão&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Depois dessa conta, ele compara o resultado com um limiar (threshold):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se o valor for maior que o limiar, ele diz: curte funk (1)&lt;/li&gt;
&lt;li&gt;Se for menor ou igual, ele diz: não curte (0)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Mas o que são esses “pesos”?
&lt;/h3&gt;

&lt;p&gt;No começo, eu buguei com esse negócio de peso. Mas depois entendi que o peso é só o quanto aquela informação influencia na decisão.&lt;/p&gt;

&lt;p&gt;Tipo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gosta de dançar? Legal, mas pode não significar muito.&lt;/li&gt;
&lt;li&gt;Vai em baile funk? Aí sim! Isso provavelmente pesa muito na decisão.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Então, o peso de “ir em baile” talvez seja maior que o peso de “gostar de dançar”.&lt;/p&gt;

&lt;h3&gt;
  
  
  E o tal do bias?
&lt;/h3&gt;

&lt;p&gt;O bias é outro elemento importante.&lt;/p&gt;

&lt;p&gt;Sem ele, a linha de decisão do perceptron sempre teria que passar pela origem (0,0), o que limita muito.&lt;/p&gt;

&lt;p&gt;Com o bias, essa linha pode se mover pra cima ou pra baixo, ajudando a separar melhor os dados.&lt;/p&gt;

&lt;p&gt;O bias é como empurrar a média final de um aluno pra cima ou pra baixo, pra ajustar essa nota mínima sem mudar a regra da escola.&lt;/p&gt;

&lt;p&gt;Lembra do limiar, aquele ponto de corte que decide entre 0 e 1? Quando usamos o bias direto na conta, a gente já tá ajustando esse corte. Ou seja, o bias ajuda o modelo a “empurrar” essa linha de decisão pra cima ou pra baixo, sem precisar de um limiar separado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Visualizando em um gráfico
&lt;/h2&gt;

&lt;p&gt;Imagina que você tem um plano com dois eixos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;X&lt;/strong&gt; (horizontal)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Y&lt;/strong&gt; (vertical)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cada ponto ali é um "exemplo" com duas características. Por exemplo:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pessoa&lt;/th&gt;
&lt;th&gt;Gosta de dançar (X)&lt;/th&gt;
&lt;th&gt;Vai em baile (Y)&lt;/th&gt;
&lt;th&gt;Curte Funk?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;0.9&lt;/td&gt;
&lt;td&gt;0.8&lt;/td&gt;
&lt;td&gt;Sim (1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;0.2&lt;/td&gt;
&lt;td&gt;0.1&lt;/td&gt;
&lt;td&gt;Não (0)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;0.7&lt;/td&gt;
&lt;td&gt;0.4&lt;/td&gt;
&lt;td&gt;Sim (1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;td&gt;0.1&lt;/td&gt;
&lt;td&gt;0.3&lt;/td&gt;
&lt;td&gt;Não (0)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Quando você plota esses pontos no gráfico, quem curte funk tá mais pra cima e pra direita, e quem não curte tá mais pra baixo e esquerda.&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%2F2n88k1ypv9o7hardfugc.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%2F2n88k1ypv9o7hardfugc.png" alt=" " width="800" height="597"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Como o perceptron aprende com os erros?
&lt;/h2&gt;

&lt;p&gt;Aí vem a parte mais massa: ele aprende com os próprios erros.&lt;/p&gt;

&lt;p&gt;Pra ensinar o perceptron, a gente não dá só as entradas (x1, x2), mas também a resposta certa que em IA a gente chama de &lt;strong&gt;rótulo&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O rótulo é o que a gente espera que o modelo diga.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;ul&gt;
&lt;li&gt;x1 = 1 (gosta de dançar)&lt;/li&gt;
&lt;li&gt;x2 = 1 (vai em baile)&lt;/li&gt;
&lt;li&gt;rótulo = 1 (a pessoa curte funk)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O perceptron calcula o resultado com os pesos e o bias:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x1&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;w1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;w2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;E compara com o rótulo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se acertou → não muda nada&lt;/li&gt;
&lt;li&gt;Se errou → ele ajusta os pesos e o bias pra tentar melhorar&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esse processo se repete com vários exemplos. É isso que a gente chama de treinamento.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que acontece depois de aprender?
&lt;/h2&gt;

&lt;p&gt;Depois de muito treino, o perceptron encontra uma linha de decisão ideal aquela que separa direitinho quem curte funk (pontos rosa) de quem não curte (pontos roxos).&lt;/p&gt;

&lt;p&gt;Mas isso depois de alguns ajustes, primeiro ele erra e acha uma linha sem muito sentido.&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%2Fx5fk3yvdmbvs6115a5or.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%2Fx5fk3yvdmbvs6115a5or.png" alt=" " width="800" height="597"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ai depois de vários ajustes, ele acha a linha ideal que separa os dois grupos direitinho.&lt;/strong&gt;&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%2Fs7c80kur11pdso1mkln9.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%2Fs7c80kur11pdso1mkln9.png" alt=" " width="800" height="597"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A linha pontilhada preta é a "linha de decisão" aprendida pelo modelo: ela separa os dois grupos, quem curte funk (pontos rosa) e quem não curte (pontos roxos). Depois de muitos ajustes, o perceptron encontra a linha ideal que separa os dois grupos.&lt;/p&gt;

&lt;p&gt;Essa linha c*&lt;em&gt;hamada linha de decisão&lt;/em&gt;* é onde o perceptron passa a dizer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Desse lado aqui → curte funk (1)&lt;/li&gt;
&lt;li&gt;Do outro lado → não curte (0)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;É tipo o cérebro dele falando: “A partir daqui, eu sei o que responder.”&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Perceptron = o neurônio mais básico de uma rede neural&lt;/li&gt;
&lt;li&gt;Recebe dados → soma ponderada com pesos e bias → toma uma decisão&lt;/li&gt;
&lt;li&gt;Aprende errando e ajustando os pesos&lt;/li&gt;
&lt;li&gt;Consegue traçar uma linha de separação entre grupos diferentes&lt;/li&gt;
&lt;li&gt;Funciona muito parecido com a forma que a gente aprende: tentando e melhorando com os erros&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;bjs bjs e até a próxima 💟&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Você realmente entende como funciona uma IA generativa?</title>
      <dc:creator>Ana Laura</dc:creator>
      <pubDate>Fri, 27 Jun 2025 01:12:47 +0000</pubDate>
      <link>https://dev.to/analaura/voce-realmente-entende-como-funciona-uma-ia-generativa-2hfb</link>
      <guid>https://dev.to/analaura/voce-realmente-entende-como-funciona-uma-ia-generativa-2hfb</guid>
      <description>&lt;p&gt;Ultimamente eu venho estudando bastante sobre inteligência artificial e comecei a me perguntar: será que a gente realmente entende o que acontece por trás dessas tecnologias?&lt;/p&gt;

&lt;p&gt;Quando comecei a aprender sobre &lt;em&gt;machine learning&lt;/em&gt; (ou aprendizado de máquina), meu primeiro pensamento foi mais ou menos assim:&lt;br&gt;&lt;br&gt;
“Tá, então a gente ensina a máquina a aprender usando dados que a gente mesmo fornece.”&lt;/p&gt;

&lt;p&gt;Por exemplo: se eu quiser prever se vai chover amanhã, eu passo pra máquina várias informações sobre o clima, como umidade, temperatura e vento. Ela analisa tudo isso, procura padrões e tenta prever a resposta. É como se ela dissesse: “olhando pra dias parecidos no passado, geralmente choveu, então provavelmente vai chover agora também.”&lt;/p&gt;

&lt;p&gt;Até aqui, a IA trabalha com dados que são mais fáceis de organizar, tipo números e planilhas. Mas o &lt;strong&gt;pulo do gato&lt;/strong&gt; acontece quando a gente entra no mundo do &lt;strong&gt;Processamento de Linguagem Natural (PLN)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Nesse momento, os dados deixam de ser números e viram &lt;strong&gt;palavras, frases, conversas humanas&lt;/strong&gt;. E aí o desafio muda completamente. Porque a linguagem humana é cheia de gírias, duplo sentido, contexto... coisas que não são tão fáceis de ensinar pra uma máquina.&lt;/p&gt;

&lt;p&gt;Tá, Ana, falei muito e talvez ainda não tenha deixado tão claro, então bora simplificar.&lt;/p&gt;




&lt;h3&gt;
  
  
  Como a máquina entende texto?
&lt;/h3&gt;

&lt;p&gt;A primeira coisa importante é entender que o computador &lt;strong&gt;não entende palavras como a gente&lt;/strong&gt;. Ele só entende números. Então, pra uma IA conseguir trabalhar com texto, ela precisa &lt;strong&gt;transformar as palavras em números&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Existem vários jeitos técnicos de fazer isso, mas o mais importante é saber que &lt;strong&gt;cada palavra vira um vetor&lt;/strong&gt;, ou seja, uma sequência de números.&lt;br&gt;&lt;br&gt;
Esses números representam &lt;strong&gt;a posição daquela palavra em um espaço imaginário com várias dimensões&lt;/strong&gt;, como se fosse um mapa onde cada palavra ocupa um lugar, dependendo de como ela é usada.&lt;/p&gt;

&lt;p&gt;Por exemplo, a palavra "banana" pode virar algo como &lt;code&gt;[2, 3, 0, 1]&lt;/code&gt;. Esses números não dizem que "banana" é amarela ou é fruta, mas mostram &lt;strong&gt;como essa palavra se relaciona com outras&lt;/strong&gt;. Se "banana" aparece perto de "fruta", "doce", "vitamina", ela vai ficar mais próxima dessas palavras no tal mapa.&lt;/p&gt;

&lt;p&gt;E como a IA aprende isso? Tentando, errando, ajustando e tentando de novo. Igualzinho a gente quando tá aprendendo algo novo.&lt;/p&gt;




&lt;h3&gt;
  
  
  E como a IA &lt;strong&gt;gera&lt;/strong&gt; um texto?
&lt;/h3&gt;

&lt;p&gt;É aqui que a mágica acontece.&lt;/p&gt;

&lt;p&gt;Depois de aprender com milhões (às vezes bilhões) de frases, a IA começa a perceber padrões. Ela entende que, por exemplo, a frase “Hoje o céu está...” provavelmente termina com “limpo”, “nublado” ou algo assim.&lt;/p&gt;

&lt;p&gt;Pense, por exemplo, no autocomplete do teclado do seu celular: às vezes ele sugere exatamente a palavra que você ia digitar e parece até “adivinhar” suas intenções.&lt;/p&gt;

&lt;p&gt;Mas ele não entende o significado das palavras, só reconhece padrões com base no que já foi digitado antes.&lt;/p&gt;

&lt;p&gt;Quando você digita uma pergunta ou escreve um texto, o processo dela é mais ou menos esse:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Transforma seu texto em números&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Lê&lt;/strong&gt; esses números e tenta entender o contexto&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prevê&lt;/strong&gt; qual é a próxima palavra que faria sentido&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Escreve essa palavra&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Repete isso, uma palavra por vez, até formar a resposta&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ela não entende o que está dizendo como a gente entende. Mas ela sabe, com base nos dados que viu, o que costuma soar certo.&lt;/p&gt;




&lt;h3&gt;
  
  
  Mas ela é inteligente mesmo?
&lt;/h3&gt;

&lt;p&gt;E é aí que mora o ponto mais importante.&lt;/p&gt;

&lt;p&gt;Apesar de parecer inteligente, uma IA como essa &lt;strong&gt;não sabe de verdade&lt;/strong&gt; o que está dizendo. Ela só repete padrões com base nos dados que recebeu.&lt;br&gt;&lt;br&gt;
Se ela nunca viu nada parecido com o que você perguntou, a resposta pode vir errada, sem sentido ou até inventada.&lt;/p&gt;

&lt;p&gt;No fim das contas, tudo funciona com muita matemática e lógica — algo muito diferente da complexidade do nosso cérebro humano.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>pln</category>
    </item>
    <item>
      <title>Quando foi que a gente parou de fazer perguntas?</title>
      <dc:creator>Ana Laura</dc:creator>
      <pubDate>Mon, 23 Jun 2025 21:23:06 +0000</pubDate>
      <link>https://dev.to/analaura/quando-foi-que-a-gente-parou-de-fazer-perguntas-45hc</link>
      <guid>https://dev.to/analaura/quando-foi-que-a-gente-parou-de-fazer-perguntas-45hc</guid>
      <description>&lt;p&gt;&lt;strong&gt;Hey, Vsauce. Michael here&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Alguns meses, descobri um dos melhores canais de todos os tempos. Talvez eu esteja um pouco chateada por não saber da existência dele antes.&lt;/p&gt;

&lt;p&gt;O Vsauce fala sobre absolutamente qualquer assunto, mas, acima de tudo, ele me ajudou a recuperar a curiosidade de entender o “porquê” das coisas.&lt;/p&gt;

&lt;p&gt;Conforme a gente vai ficando mais velho, muitas vezes paramos de questionar o mundo ao nosso redor. Mas o Vsauce não. Ele questiona tudo — e traz vídeos incríveis sobre temas aparentemente simples, como por exemplo: &lt;a href="https://www.youtube.com/watch?v=ZD037VSAG2I" rel="noopener noreferrer"&gt;Por que batemos palma?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Meu único objetivo com esse post é te perguntar:&lt;br&gt;
Por que a gente para de questionar as coisas?&lt;/p&gt;

&lt;p&gt;Obrigada, Michael (Vsauce), por ter me ajudado a reencontrar isso. :)&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Tipos de Aprendizado de Máquina</title>
      <dc:creator>Ana Laura</dc:creator>
      <pubDate>Tue, 23 Apr 2024 02:48:56 +0000</pubDate>
      <link>https://dev.to/analaura/tipos-de-aprendizado-de-maquina-2205</link>
      <guid>https://dev.to/analaura/tipos-de-aprendizado-de-maquina-2205</guid>
      <description>&lt;p&gt;No meu último post aqui, eu trouxe um pouco do que venho vivenciando aprendendo sobre análise de dados. Dando sequência aos meus estudos, comecei a estudar um pouco sobre machine learning e trouxe aqui alguns conceitos mais básicos, como os tipos de aprendizado que existem!&lt;/p&gt;

&lt;p&gt;Grande parte das coisas escritas aqui vem do que estou aprendendo no livro: &lt;br&gt;
&lt;a href="https://www.amazon.com.br/M%C3%A3os-obra-aprendizado-Scikit-Learn-inteligentes/dp/8550815489" rel="noopener noreferrer"&gt;Mãos à obra: aprendizado de máquina com scikit-learn &amp;amp; tensorflow&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;del&gt;To achando muito legal aprender sobre tudo isso. Sabe, é como se eu estivesse aprendendo sobre o cérebro de um computador. kkk&lt;/del&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Então, vamos lá!&lt;/em&gt;&lt;/p&gt;



&lt;p&gt;Esse tipo de aprendizado se divide em algumas categorias. Vou resumir aqui, mas no decorrer do artigo aprofundarei em cada uma delas.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Treinamento com Supervisão Humana&lt;/strong&gt;: Os algoritmos de aprendizado de máquina podem ser treinados com ou sem supervisão humana. Isso é conhecido como:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Aprendizado Supervisionado&lt;/strong&gt;: O algoritmo aprende a partir de um conjunto de dados rotulados fornecidos por humanos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aprendizado Não Supervisionado&lt;/strong&gt;: O algoritmo aprende a partir de um conjunto de dados não rotulados, encontrando padrões e estruturas nos dados.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aprendizado Semissupervisionado&lt;/strong&gt;: Uma combinação dos dois anteriores, onde o algoritmo aprende a partir de um conjunto de dados parcialmente rotulados.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aprendizado por Reforço&lt;/strong&gt;: O algoritmo aprende através de tentativa e erro, recebendo recompensas ou punições por suas ações.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aprendizado em Tempo Real&lt;/strong&gt;: Alguns algoritmos podem aprender gradualmente em tempo real. Isso é conhecido como aprendizado online. Por outro lado, o aprendizado em lote ocorre quando o algoritmo aprende a partir de um grande conjunto de dados de uma só vez.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aprendizado Baseado em Instância vs Aprendizado Baseado em Modelo&lt;/strong&gt;: Os algoritmos de aprendizado de máquina podem aprender de duas maneiras principais:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Aprendizado Baseado em Instância&lt;/strong&gt;: O algoritmo aprende os pontos de dados exatos do conjunto de treinamento e faz previsões com base em quão semelhante é um novo ponto de dados aos pontos de dados conhecidos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aprendizado Baseado em Modelo&lt;/strong&gt;: O algoritmo detecta padrões nos dados de treinamento e cria um modelo preditivo. Esse modelo é então usado para fazer previsões sobre novos pontos de dados.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E ah, podemos combinar cada um desses critérios. Igual na programação onde podemos usar várias libs diferentes juntas. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;No livro que estou lendo, ele dá um exemplo do filtro de spam. Imagine que você já utiliza de um filtro de spam muito bom, que já faz bem o trabalho dele. Porém, alguns e-mails de spam mudaram e esse filtro já não consegue captá-los, podemos então fazer com que ele aprenda instantaneamente com a utilização de um modelo de rede neural profundo treinado a partir de exemplos novos de spam. Isso faz dele um sistema de aprendizado supervisionado online, baseado em modelos. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Agora vamos detalhar cada um dos tipos de aprendizados. Bora lá: &lt;/p&gt;
&lt;h2&gt;
  
  
  Aprendizado supervisionado/ Não Supervisionado 🎓
&lt;/h2&gt;

&lt;p&gt;Podemos classificar aqui de acordo com a quantidade e também o tipo de supervisão que essas máquinas recebem durante seu treinamento.&lt;/p&gt;

&lt;p&gt;Esse tipo de aprendizado se divide em quatro categorias:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supervisionado&lt;/li&gt;
&lt;li&gt;Não supervisionado&lt;/li&gt;
&lt;li&gt;Semissupervisionado&lt;/li&gt;
&lt;li&gt;Aprendizado por reforço &lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Aprendizado supervisionado 👩‍🏫
&lt;/h3&gt;

&lt;p&gt;Nesse tipo de aprendizado, todo conjunto de dados fornecidos para treinamento do algoritmo inclui as soluções desejadas. Chamamos isso de &lt;code&gt;rótulos&lt;/code&gt; ou &lt;code&gt;labels&lt;/code&gt;. Voltando ao exemplo do spam, é como se ele fosse treinado com muitos exemplos de e-mails juntos e dentre esses e-mails vamos ter alguns spams. Para treinar esse tipo de sistema é necessário dar pra ele muitos exemplos de e-mails.&lt;/p&gt;

&lt;p&gt;Em aprendizado de máquina, quando falamos em &lt;code&gt;atributo&lt;/code&gt;, é um tipo de dado, por exemplo, os e-mails (textos), já as &lt;code&gt;características&lt;/code&gt; assumem vários significados dependendo do contexto, geralmente corresponde ao atributo mais o seu valor. Por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Olá eu sou um e-mail!!!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Veja alguns exemplos de algoritmos supervisionados. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;K-ésimo vizinho mais próximo&lt;/li&gt;
&lt;li&gt;Regressão linear&lt;/li&gt;
&lt;li&gt;Regressão logística&lt;/li&gt;
&lt;li&gt;Máquinas de vetores de suporte&lt;/li&gt;
&lt;li&gt;Árvores de decisão e florestas aleatórias&lt;/li&gt;
&lt;li&gt;Redes neurais&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Aprendizado não supervisionado 🤖
&lt;/h3&gt;

&lt;p&gt;Nesse caso, os dados de treinamento não são rotulados, ou seja, não trazem as soluções desejadas.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Você deve estar pensando: UAI, E AGORA?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nesse caso, o sistema tenta aprender sem um “professor”, na marra!&lt;/p&gt;

&lt;p&gt;Temos alguns tipos, sendo os mais importantes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clusterização&lt;/li&gt;
&lt;li&gt;K-Means&lt;/li&gt;
&lt;li&gt;Clusterização espacial baseada em densidade de aplicações com ruídos&lt;/li&gt;
&lt;li&gt;Análise de cluster hierárquica&lt;/li&gt;
&lt;li&gt;Detecção de anomalias&lt;/li&gt;
&lt;li&gt;Floresta de isolamento&lt;/li&gt;
&lt;li&gt;Dentre outros…&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vamos imaginar que você trabalha em uma escola dando aulas e gostaria de entender quais grupos de pessoas possuem mais semelhanças. Em nenhum momento vamos informar para o nosso algoritmo qual grupo o aluno X pertence, vai ser tarefa dele entender isso sozinho.&lt;/p&gt;

&lt;p&gt;Outros exemplos bem comuns de aprendizado não supervisionado é a detecção de anomalia, transações incomuns no cartão pra evitar algum tipo de fraude, uma outra tarefa bem parecida seria a detecção de novidades, onde o objetivo é detectar coisas novas/instâncias novas que aparecem diferente de todas as outras que o conjunto de treinamento já possui. &lt;strong&gt;Vale lembrar que esse tipo de situação exige um conjunto de treinamento muito limpo&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;No livro, ele dá um exemplo bem legal que é, imagine que você tenha milhares de fotos de cachorros e 1% delas representa um PUG, um algoritmo de detecção de novidade não deve tratar as novas fotos de PUG como novidade. Agora, em contrapartida disso, os algoritmos de detecção de anomalias poderiam considerar esses PUG’s tão raros e tão diferentes que provavelmente os classificaria como anomalias, o que não é nada legal…&lt;/p&gt;

&lt;p&gt;Um outro exemplo de situação que poderíamos usar esse tipo de aprendizado, vamos imaginar que você tenha um mercadinho, e aí usamos uma regra de associação nos registros de vendas desse nosso mercadinho, com isso descobrimos que as pessoas que compram carne moída, presunto e queijo estão mais propensas a comprar também massa de lasanha, dessa forma podemos deixar a massa de lasanha mais próxima desses itens.&lt;/p&gt;

&lt;h3&gt;
  
  
  Aprendizado semissupervisionado 🤝
&lt;/h3&gt;

&lt;p&gt;Rotular dados demanda muito &lt;strong&gt;tempo e dinheiro&lt;/strong&gt;, então teremos alguns casos onde a grande quantidade de instâncias não rotuladas será bem maior que as rotuladas. E pra isso, a gente tem um nome chique: &lt;em&gt;aprendizado semissupervisionado&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;O livro traz um exemplo muito bom que é o Google Fotos, sabe quando ele meio que detecta as pessoas em comum, por exemplo, sabe todas as fotos que tem sua mãe, alguma amiga ou namorada e ele consegue detectar isso? Então, essa é a parte não supervisionada do algoritmo (&lt;em&gt;clusterização&lt;/em&gt;), e aí ele fica esperando que você fale pra ele quem são essas pessoas ou seja, insira rótulos pra cada uma delas. Fazendo isso, você será capaz de pesquisar fotos da e com a pessoa a partir do seu nome.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A grande parte dos algoritmos de aprendizado semissupervisionado são combinações de algoritmos supervisionados e não supervisionados. :)&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Aprendizado por Reforço 🎮
&lt;/h3&gt;

&lt;p&gt;Esse aprendizado é bem diferente dos demais. Nesse contexto, temos um elemento chamado de &lt;code&gt;agente&lt;/code&gt;, que pode observar o ambiente, selecionar e executar ações e obter recompensas em troca, ou penalidades dependendo do caso &lt;em&gt;(recompensas negativas)&lt;/em&gt;. Ele deve aprender sozinho qual é a melhor estratégia, que chamamos de política, para obter o maior número de recompensas ao longo do tempo. Essa política é o que define qual ação o agente deverá escolher quando está em uma determinada situaçã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%2F3dyfewppyfyk878whsk3.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%2F3dyfewppyfyk878whsk3.png" alt="aprendizado reforco" width="602" height="430"&gt;&lt;/a&gt;&lt;br&gt;
Imagem retirei desse artigo &lt;a href="https://www.redesdesaude.com.br/aprendizado-de-maquina-machine-learning/" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Um exemplo de agente treinando para aprender a jogar o jogo de videogame “Super Mario Bros”:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ambiente: O mundo do jogo “Super Mario Bros”, incluindo todos os inimigos, moedas, power-ups, buracos, etc.&lt;/li&gt;
&lt;li&gt;Agente: O algoritmo de aprendizado por reforço que está tentando aprender a jogar “Super Mario Bros”.&lt;/li&gt;
&lt;li&gt;Ações: Os movimentos possíveis que o agente pode fazer (por exemplo, ir para a esquerda, ir para a direita, pular, etc.).&lt;/li&gt;
&lt;li&gt;Recompensas: O agente recebe uma recompensa positiva quando coleta uma moeda, derrota um inimigo ou completa um nível. Recebe uma recompensa negativa quando é derrotado por um inimigo ou cai em um buraco.&lt;/li&gt;
&lt;li&gt;Política: A estratégia que o agente usa para decidir qual ação tomar em um determinado estado. A política é atualizada à medida que o agente aprende com a experiência.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O objetivo do agente é aprender a política que maximiza a soma total de recompensas ao longo do tempo. Ele faz isso através de um processo de tentativa e erro, onde ele explora o ambiente (jogando o jogo e vendo os resultados) e explota o conhecimento que adquiriu (fazendo movimentos que ele acredita que levarão a recompensas altas).&lt;/p&gt;

&lt;h2&gt;
  
  
  Aprendizado em Batch e Online 📊
&lt;/h2&gt;

&lt;p&gt;Outro critério que é usado para classificarmos os sistemas de aprendizado é se ele consegue ou não aprender de forma incremental, isto é, a partir da entrada de um fluxo de dados.&lt;/p&gt;

&lt;h3&gt;
  
  
  Aprendizado em Batch (por Ciclo) 🔄
&lt;/h3&gt;

&lt;p&gt;Nesse caso, o sistema não consegue aprender de forma incremental, ele deve ser treinado usando todos os dados disponíveis. Isso demanda muito tempo e recurso computacional, então normalmente ele é realizado offline. Primeiro o sistema é treinado, em seguida é implementado, e como todo o treinamento/aprendizado já foi adquirido, ele roda/executa sem aprender mais nada. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;E se eu quiser ter acesso a dados novos?&lt;/em&gt; Aí você vai precisar treinar ele novamente a partir do zero no conjunto completo de dados, ou seja, não só com os dados novos mas também com os antigos e por fim descontinua com o sistema antigo substituindo pelo novo. A parte boa disso tudo é que todo esse processo de treinamento até a disponibilização pode ser automatizado. &lt;/p&gt;

&lt;p&gt;Vale lembrar que esse tipo de coisa leva bastante tempo, então geralmente treina-se um novo sistema apenas a cada 24 horas ou semanalmente. E ah, caso esse sistema tenha recursos limitados (memória, E/S do disco, E/S de rede etc.) fazer upload de grandes quantidades de dados e usar os inúmeros recursos para treinar por dias e horas isso com toda certeza resultaria num bug do tipo &lt;code&gt;showstop&lt;/code&gt;. Um "bug do tipo &lt;code&gt;showstop&lt;/code&gt;" é um erro ou falha que ocorreria se o sistema tentasse processar uma quantidade muito grande de dados de uma só vez, especialmente se os recursos do sistema fossem limitados. Isso poderia causar uma variedade de problemas, como travamentos do sistema, lentidão extrema ou até mesmo a perda de dados. Portanto, nesse caso, é melhor tentar algum algoritmo que aprende de forma incremental, processando os dados em pequenos lotes ao longo do tempo, em vez de tentar processar todos os dados de uma vez.&lt;/p&gt;

&lt;h3&gt;
  
  
  Aprendizado online (incremental) 📈
&lt;/h3&gt;

&lt;p&gt;Nesse caso, já conseguimos treinar nosso sistema incrementalmente, ou seja, fornecendo para ele as instâncias de dados de forma sequencial, individual ou em pequenos grupos, chamados de mini-batches. &lt;em&gt;&lt;del&gt;Traduzindo: Na calmaria!&lt;/del&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Cada etapa desse aprendizado é rápida e tem um custo bem mais baixo, assim o sistema consegue aprender instantaneamente os dados novos em tempo real, assim que eles entram. &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%2Fp7xjs3q3c53dlc8jmypm.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%2Fp7xjs3q3c53dlc8jmypm.png" alt="imagem com fluxo que representa o aprendizado online" width="800" height="486"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse tipo de aprendizado é muito bom para sistemas que recebem dados em um fluxo contínuo e que precisam se adaptar a essas mudanças rápido ou de forma independente, por exemplo: preço das ações, mudança no clima.&lt;/p&gt;

&lt;p&gt;Ou também quando seus recursos computacionais são limitados, até porque uma vez que o seu sistema aprendeu com aqueles dados ele não precisa mais deles, logo você pode descartar. (a menos que precise daqueles dados depois). O que pode economizar bastante espaço. &lt;/p&gt;

&lt;p&gt;Os algoritmos de aprendizagem incremental também são utilizados para treinar sistemas em grandes conjuntos de dados que não cabem na memória principal de uma máquina, chamamos isso de aprendizado &lt;em&gt;out-of-core&lt;/em&gt;. O algoritmo faz upload de parte desses dados, executa uma etapa do treinamento neles e repete esse processo até que ele tenha sido executado em todos os dados.&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%2F06u5m22c59m2mqerewb1.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%2F06u5m22c59m2mqerewb1.png" alt="imagem com fluxo incremental tratando muitos dados" width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Um ponto importante dos sistemas de aprendizado online é a rapidez com que eles devem se adaptar a mudanças de dados, para isso usamos a &lt;code&gt;taxa de aprendizado&lt;/code&gt;. Por exemplo: Se você definir uma alta taxa de aprendizado, o sistema vai se adaptar rapidamente a dados novos mas também vai esquecer mais rápido os dados antigos. Agora se você definir uma taxa mais baixa de aprendizado, o sistema vai ser mais &lt;em&gt;"preguiçoso",&lt;/em&gt; assim dizendo, ele vai aprender porém numa velocidade menor.&lt;/p&gt;

&lt;p&gt;Um grande problema/desafio nesse tipo de aprendizado é que se fornecermos dados ruins o desempenho do sistema diminui gradualmente. Para mitigar isso, precisamos monitorar de perto o sistema e parar com o aprendizado dele imediatamente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Aprendizado baseado em instâncias VS baseado em modelo 🔍
&lt;/h2&gt;

&lt;p&gt;Outra maneira de classificar esses sistemas de aprendizado de máquina é por meio da &lt;em&gt;generalização&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;A maioria desses sistemas trabalha com &lt;strong&gt;predições&lt;/strong&gt;. Predições, no contexto de aprendizado de máquina, referem-se à capacidade de um modelo de usar informações que ele aprendeu de um conjunto de dados de treinamento para fazer uma estimativa informada ou "previsão" sobre algo. Por exemplo, se tivermos um modelo treinado para prever o preço de uma casa com base em suas características (como tamanho, número de quartos, localização, etc.), o modelo pode "prever" o preço de uma nova casa com base nessas características.&lt;/p&gt;

&lt;p&gt;Portanto, quando dizemos "dado uma série de exemplos de treinamento, o sistema precisa conseguir fazer predições boas o suficiente para (generalizar) exemplos que nunca viu antes", estamos dizendo que o sistema deve ser capaz de aplicar o que aprendeu com os dados de treinamento para fazer previsões precisas sobre novos dados que não faziam parte do conjunto de treinamento. A capacidade de um modelo de fazer isso - de generalizar a partir de seus dados de treinamento para novos dados - é uma medida fundamental de seu desempenho.&lt;/p&gt;

&lt;p&gt;A ideia é que ter bons rendimentos em dados de treinamento é muito bom, mas melhor ainda é ter em instâncias de dados novas.&lt;/p&gt;

&lt;p&gt;Temos duas abordagens principais no que se diz a respeito da generalização. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aprendizado baseado em instâncias &lt;/li&gt;
&lt;li&gt;Aprendizado baseado em modelo&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Aprendizado baseado em instância 📚
&lt;/h3&gt;

&lt;p&gt;Se pararmos para analisar nós mesmos, a forma mais simples de se aprender é memorizando algo, concorda comigo? Mas se a gente aplicar algo do tipo para um filtro de spam, por exemplo, ele apenas sinalizaria todos os e-mails idênticos/iguais em relação aos e-mails já sinalizados pelos usuários. Não é a pior solução do mundo, mas também não é a melhor, rs!&lt;/p&gt;

&lt;p&gt;Em vez de fazer isso, podemos mudar nossa abordagem, que tal nosso filtro sinalizar também os e-mails semelhantes aos conhecidos?! Isso exige o que chamamos de medida de similaridade (SM) entre dois e-mails.&lt;/p&gt;

&lt;p&gt;Vamos pensar o seguinte, essa medida de similaridade ela poderia conter o número de palavras que eles têm em comum, dessa forma o sistema marcaria um e-mail como spam se tivesse muitas palavras em comum com um e-mail &lt;strong&gt;spam conhecido&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Para isso damos o nome de aprendizado baseado em instância: o sistema aprende os exemplos usando a memorização e depois generaliza para novos casos e para isso ele usa uma medida de similaridade que serve basicamente para comparar com os outros exemplos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Aprendizado baseado em modelo 🛠️
&lt;/h3&gt;

&lt;p&gt;Aqui utilizamos algoritmos que podem aprender a partir de dados e fazer previsões ou decisões.&lt;/p&gt;

&lt;p&gt;Esses modelos são “treinados” usando conjuntos de dados históricos, onde eles identificam padrões e relações. Uma vez treinados, eles podem ser aplicados a novos dados para prever resultados.&lt;/p&gt;

&lt;p&gt;Voltando ao nosso conjunto de dados sobre casas e seus preços. As características das casas (como tamanho, número de quartos, localização) são as entradas do modelo, e os preços são as saídas que queremos prever.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Coleta de Dados: Você reúne dados de várias casas vendidas recentemente.&lt;/li&gt;
&lt;li&gt;Treinamento do Modelo: Você escolhe um modelo de aprendizado de máquina, como a regressão linear, e “ensina” ao modelo como o preço das casas se relaciona com suas características.&lt;/li&gt;
&lt;li&gt;Teste do Modelo: Depois de treinado, você testa o modelo com dados de casas cujos preços você já conhece para ver se ele pode prever corretamente.&lt;/li&gt;
&lt;li&gt;Uso do Modelo: Uma vez que o modelo está bem ajustado, você pode usá-lo para estimar o preço de uma casa nova no mercado, baseando-se nas suas características.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O modelo aprendeu a relação entre as características das casas e seus preços e agora pode fazer previsões informadas sobre novas casas. &lt;/p&gt;

&lt;p&gt;Isso é aprendizado de máquina baseado em modelo. Ele é útil porque pode nos ajudar a tomar decisões baseadas em dados e experiências passadas.&lt;em&gt;&lt;del&gt;(queria aplicar isso na minha vida real)&lt;/del&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Vou deixar o &lt;a href="https://github.com/anabergerr/machine-learning-studies" rel="noopener noreferrer"&gt;link do GitHub&lt;/a&gt; onde estou colocando códigos e também explicações desses meus últimos aprendizados nesse mundo muito doido de Machine Learning haha!&lt;/p&gt;

&lt;p&gt;Qualquer duvida, vocês já sabem! Podem me perturbar.&lt;/p&gt;

&lt;p&gt;bjs bjs e até a próxima 💟&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>machinelearning</category>
      <category>ia</category>
      <category>iniciante</category>
    </item>
    <item>
      <title>Meus Últimos Meses Estudando Análise de Dados 🎲</title>
      <dc:creator>Ana Laura</dc:creator>
      <pubDate>Mon, 08 Apr 2024 06:44:24 +0000</pubDate>
      <link>https://dev.to/analaura/falando-dos-meus-ultimos-meses-de-estudo-em-analise-de-dados-dl9</link>
      <guid>https://dev.to/analaura/falando-dos-meus-ultimos-meses-de-estudo-em-analise-de-dados-dl9</guid>
      <description>&lt;p&gt;E aí, cês tão bem? 💟&lt;/p&gt;

&lt;p&gt;Recentemente, eu comecei a estudar sobre análise de dados e vim aqui falar um pouco de como está sendo minha experiência.&lt;/p&gt;

&lt;p&gt;O objetivo desse post aqui é trazer um pouco da minha percepção sobre aprender análise de dados, tendo tido contato com programação, trabalhando com desenvolvimento front-end e desenvolvimento mobile. Como tem sido a minha experiência nesses últimos 3 meses me dedicando a estudar e finalizando um estudo de caso.&lt;/p&gt;

&lt;p&gt;O curso que fiz foi esse &lt;a href="https://www.coursera.org/professional-certificates/analise-de-dados-do-google" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;, recomendo bastante. Achei bem didático e com toda certeza aprendi muita coisa.&lt;/p&gt;

&lt;p&gt;Fazendo uma ponte entre os conhecimentos que eu já tinha e análise de dados, eu diria que tem muitas coisas que são parecidas, veja bem, parecidas, não iguais. Resolver problemas é um exemplo de algo que a gente já lida no nosso dia a dia como pessoa programadora. Então, toda essa parte do pensamento lógico de: fazer perguntas, de dividir um problema em várias partes. Isso também faz muita parte da análise de dados.&lt;/p&gt;

&lt;p&gt;Então, foi muito daora poder entender isso e pensar:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;po, isso eu já sabia!!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Outro tópico super importante: Comunicação. O curso tem um módulo voltado só para parte de comunicação. Saber se comunicar tanto com time como na hora de propor ideias, tirar dúvidas, enfim, se comunicar é e sempre será importante em todas as áreas.&lt;/p&gt;

&lt;p&gt;A parte que mais gostei, com toda a certeza, foi a parte de limpar dados, mesclar dados, analisar os dados e depois responder às perguntas que foram feitas com base nos dados.&lt;/p&gt;

&lt;p&gt;No curso, pude fazer toda parte de limpeza e análise utilizando a linguagem R. Confesso que achei bem diferente do que estava habituada, já que trabalhei com javascript, python e kotlin, que são linguagens bem diferentes. R é bem matemático, eu diria.&lt;/p&gt;

&lt;p&gt;É muito legal você pegar um conjunto de dados, entender a história daqueles dados e propor soluções baseadas no que foi pedido, no que foi proposto. Eu pude entender também a importância dos dados e como eles são utilizados, como eles fazem parte do nosso dia a dia e como a cada dia que passa temos mais dados sendo criados.&lt;/p&gt;

&lt;p&gt;O meu projeto final do curso/estudo de caso tinham 3 trilhas a serem seguidas, mas escolhi a trilha onde tinha uma empresa fictícia, resumidamente de aluguéis de bicicletas, e eu tinha que fazer uma análise de alguns dados desses clientes e trazer algumas soluções.&lt;/p&gt;

&lt;p&gt;Vou deixar aqui o &lt;a href="https://github.com/anabergerr/estudo-caso-cyclistic" rel="noopener noreferrer"&gt;link&lt;/a&gt; do repositório no GitHub que explica com mais detalhes o que é esse projeto e lá já tem o link para a apresentação do projeto também. &lt;/p&gt;

&lt;p&gt;Qualquer duvida, vocês já sabem! Podem me perturbar. &lt;/p&gt;

&lt;p&gt;bjs bjs e até a próxima 💟&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Complexidade de Espaço dos Algoritmos</title>
      <dc:creator>Ana Laura</dc:creator>
      <pubDate>Mon, 15 Jan 2024 23:02:22 +0000</pubDate>
      <link>https://dev.to/analaura/complexidade-de-espaco-dos-algoritmos-166a</link>
      <guid>https://dev.to/analaura/complexidade-de-espaco-dos-algoritmos-166a</guid>
      <description>&lt;p&gt;Eai, cês tão bem? &lt;/p&gt;

&lt;p&gt;Nesse &lt;a href="https://dev.to/analaura/complexidade-de-tempo-dos-algoritmos-o-que-eu-aprendi-512l"&gt;meu post&lt;/a&gt; falei sobre complexidade de tempo dos algoritmos e hoje pra finalizarmos esse tópico de complexidades, irei falar um pouco sobre a complexidade de espaço. Bora lá? 🌚    &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;ps: Usarei python para explicar alguns conceitos&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é complexidade de espaço 🪐
&lt;/h2&gt;

&lt;p&gt;No post que citei acima falei sobre a complexidade de tempo, que, em resumo, diz respeito à "quantidade de tempo" que um algoritmo precisa para executar. Agora, vamos de falar sobre a complexidade de espaço, que se refere à quantidade de memória necessária para executar um algoritmo. Em termos simples, a complexidade de espaço é expressa considerando a quantidade de memória adicional utilizada em relação ao tamanho da entrada fornecida ao nosso algoritmo.&lt;/p&gt;

&lt;p&gt;👀 Dê uma olhada no código abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;doubled_number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O que fazemos aqui é percorrer cada elemento do array passado como parâmetro, multiplicá-lo por dois e adicioná-lo a um novo array chamado &lt;code&gt;result&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Podemos concluir, então, que se eu passar um array com 100 números, ele me retornará um novo array com 100 números. Da mesma forma, se eu passar um array com 10 elementos, o resultado será um novo array com 10 elementos.&lt;/p&gt;

&lt;p&gt;"Então, Ana, qual conclusão tiramos disso tudo?" Quanto mais a entrada cresce, a saída também cresce e, consequentemente, o espaço ocupado por ela também aumenta. Isso implica dizer que a Complexidade de Espaço é dada por &lt;code&gt;O(n)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Vamos ver outro exemplo agora:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sum_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nb"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nb"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;sum&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A função acima percorre uma lista de números, soma todos eles e, no final, retorna o resultado dessa soma.&lt;/p&gt;

&lt;p&gt;A complexidade de espaço para essa função é &lt;code&gt;O(1)&lt;/code&gt;, ou seja, constante. Isso ocorre porque a função utiliza apenas uma variável adicional, &lt;code&gt;sum&lt;/code&gt;, para armazenar todo o resultado acumulado.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Independentemente do tamanho do array de entrada, a quantidade de espaço necessária para a variável soma permanece constante.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;De forma prática, a complexidade de espaço &lt;code&gt;O(1)&lt;/code&gt; significa que o consumo de memória da função não aumenta com o tamanho do array. Mesmo se o array tiver milhões de elementos, a função ainda exigirá a mesma quantidade de espaço adicional para a variável &lt;code&gt;sum&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;👀 E pra finalizarmos vale super a pena dar uma olhada neste site &lt;a href="https://www.bigocheatsheet.com/" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;, que mostra a complexidade em um gráfico e pode ajudar a entender, especialmente em relação à notação Big O, utilizada para descrever a eficiência de algoritmos em termos de tempo e espaço. Se tiver dúvidas sobre isso, falei mais a respeito neste meu &lt;a href="https://dev.to/analaura/complexidade-de-tempo-dos-algoritmos-o-que-eu-aprendi-512l"&gt;artigo aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Espero ter ajudado! 😊&lt;/p&gt;

&lt;p&gt;bjs bjs e até a próxima 💟&lt;/p&gt;

</description>
      <category>python</category>
      <category>braziliandevs</category>
      <category>algorithms</category>
    </item>
    <item>
      <title>Entendendo RecyclerView de Uma Vez Por Todas</title>
      <dc:creator>Ana Laura</dc:creator>
      <pubDate>Mon, 04 Dec 2023 16:05:38 +0000</pubDate>
      <link>https://dev.to/analaura/entendendo-recyclerview-de-uma-vez-por-todas-47jf</link>
      <guid>https://dev.to/analaura/entendendo-recyclerview-de-uma-vez-por-todas-47jf</guid>
      <description>&lt;p&gt;E aí, cês tão bem?&lt;/p&gt;

&lt;p&gt;Nos últimos dias, tenho me dedicado a estudar Android e me deparei com o seguinte desafio: entender o &lt;code&gt;RecyclerView&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Então, este artigo é para você que não está entendendo muito bem como isso funciona e eu, como uma boa amante de formas diferentes de explicar coisas complexas, cá estou.&lt;/p&gt;

&lt;h2&gt;
  
  
  Usando RecyclerView para organizar uma festa 🥳
&lt;/h2&gt;

&lt;p&gt;Para te ajudar a entender, vou precisar que você comece imaginando que vamos dar uma festa de comidas típicas do meu estado, Minas Gerais, e para isso, precisamos definir algumas coisas. Saiba que o local da festa já foi escolhido.&lt;/p&gt;

&lt;p&gt;Precisamos decidir como organizar as mesas e servir os pratos típicos. Para isso, pensei em nos organizarmos da seguinte forma:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Precisamos definir no espaço principal onde iremos organizar as mesas e cadeiras para nossos convidados. Temos que distribuir tudo perfeitamente para que a festa seja agradável e todos possam aproveitar.&lt;/li&gt;
&lt;li&gt;Temos um cardápio com todos os pratos que queremos servir. Vamos precisar de um chef/assistente para nos ajudar a decidir quais pratos do cardápio incluir na festa e também ajudar a organizá-los nos suportes adequados. Se decidirmos adicionar um novo prato ao cardápio, nosso Chef nos ajuda a garantir que tenhamos um suporte certo para esse prato. Ele vai gerenciar essa relação entre o cardápio e os suportes, facilitando a escolha e exibição dos pratos na festa.&lt;/li&gt;
&lt;li&gt;Agora, pense nos pratos típicos que queremos servir. Vamos precisar de um suporte para cada prato. Cada suporte será designado para segurar um prato específico, garantindo que quando decidirmos servir algo, já temos um lugar definido para isso. Sem o suporte, teríamos que procurar constantemente onde colocar ou onde está cada prato na mesa, e isso deixaria o atendimento aos convidados menos fluído.&lt;/li&gt;
&lt;li&gt;Pensar na disposição das mesas. Precisamos contratar um planejador de festas. Ele vai nos ajudar a decidir se queremos organizar as mesas em fileiras, círculos ou qualquer outra forma que torne a festa mais aconchegante. Se decidirmos que queremos mesas em círculo, o planejador organiza automaticamente as mesas dessa forma. Ele ajuda a criar o layout ideal para que todos os convidados possam aproveitar a festa da melhor maneira possível.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Resumindo, temos que:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Definir o espaço principal da festa;&lt;/li&gt;
&lt;li&gt;Suporte especial para cada prato;&lt;/li&gt;
&lt;li&gt;Assistente que organiza o cardápio nos suportes;&lt;/li&gt;
&lt;li&gt;Planejador que decide como organizar as mesas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E agora você deve estar pensando, mas o que isso tem a ver com RecyclerView?&lt;/p&gt;

&lt;p&gt;Festas e RecyclerView, acredito eu, que não tenham muitas coisas em comum. Ouso dizer que são até opostos demais 😅, mas vamos entender um pouco mais onde quero chegar com essa comparação:&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;RecyclerView&lt;/code&gt; será o nosso espaço principal da festa, o &lt;code&gt;ViewHolder&lt;/code&gt; é o suporte especial para cada prato, o &lt;code&gt;Adapter&lt;/code&gt; é o assistente que organiza o cardápio nos suportes, e o &lt;code&gt;LayoutManager&lt;/code&gt; é o planejador que decide como organizar as mesas. Juntos, eles tornam a festa organizada e garantem que todos desfrutem da experiência.&lt;/p&gt;

&lt;p&gt;Agora que entendemos um pouco mais sobre o que é o que, vamos para o código!&lt;/p&gt;

&lt;h2&gt;
  
  
  Código e um pouco de teoria 💻
&lt;/h2&gt;

&lt;p&gt;O RecyclerView é tipo um mestre da reciclagem na tela do seu app. Sabe quando você olha para uma lista enorme no celular e pensa "poxa, será que precisava carregar tudo de uma vez?" - é aí que o RecyclerView entra.&lt;/p&gt;

&lt;p&gt;Imagina que você está criando uma lista que não para de crescer, tipo uma lista de mensagens de chat. O RecyclerView é como o chefão dessa operação. Ele garante que só os itens que estão aparecendo na tela sejam criados, economizando bateria e tornando tudo mais rápido.&lt;/p&gt;

&lt;p&gt;A equipe do RecyclerView inclui alguns membros importantes como já falamos anteriormente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RecyclerView: Funciona como o componente visual responsável por posicionar e exibir a lista na tela.&lt;/li&gt;
&lt;li&gt;ViewHolder: Serve como a referência para cada item presente na lista, desempenhando um papel crucial na reciclagem de componentes.&lt;/li&gt;
&lt;li&gt;Adapter: Responsável por mapear os dados do modelo para cada item exibido na lista, garantindo uma conexão eficiente entre os dados e a interface.&lt;/li&gt;
&lt;li&gt;LayoutManager: É o componente encarregado de gerenciar a disposição dos elementos na RecyclerView, proporcionando controle sobre o layout da lista.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Começamos criando nosso espaço principal, ou seja, o &lt;code&gt;RecyclerView&lt;/code&gt;. Podemos adicioná-lo diretamente no XML ou pelo editor de layout:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;androidx.recyclerview.widget.RecyclerView&lt;/span&gt;  
    &lt;span class="na"&gt;android:id=&lt;/span&gt;&lt;span class="s"&gt;"@+id/recyclerView"&lt;/span&gt;  
    &lt;span class="na"&gt;android:layout_width=&lt;/span&gt;&lt;span class="s"&gt;"match_parent"&lt;/span&gt;  
    &lt;span class="na"&gt;android:layout_height=&lt;/span&gt;&lt;span class="s"&gt;"match_parent"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Agora podemos buscá-lo no nosso código Kotlin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;recyclerView&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;RecyclerView&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;findViewById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recyclerView&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;E já ta pronto? Ainda não!&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Primeiro vamos precisar vincular nosso &lt;code&gt;RecyclerView&lt;/code&gt; a um &lt;code&gt;LayoutManager&lt;/code&gt;, e depois:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Vamos precisar de um conjunto de dados, depois precisamos;&lt;/li&gt;
&lt;li&gt;Vincular o conjunto de dados a uma representação visual com o &lt;code&gt;ViewHolder&lt;/code&gt; e, por fim;. &lt;/li&gt;
&lt;li&gt;Vincular este dados ao &lt;code&gt;RecyclerView&lt;/code&gt; utilizando um &lt;code&gt;Adapter&lt;/code&gt;;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O LayoutManager é o cara responsável por organizar os itens visuais dentro do nosso &lt;code&gt;RecyclerView&lt;/code&gt;, definindo também o critério de quando os itens devem ser "reciclados".&lt;/p&gt;

&lt;p&gt;Para começar vamos usar o &lt;code&gt;LinearLayoutManager&lt;/code&gt;, para listas verticais e simples.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="n"&gt;recyclerView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;layoutManager&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LinearLayoutManager&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, vamos focar nos itens da nossa lista!&lt;/p&gt;

&lt;p&gt;Vou criar um conjunto de dados de comidas. Então, primeiro, criamos a classe &lt;code&gt;Food&lt;/code&gt;. Lembrando que esta classe será um modelo de dados e para isso precisamos criá-la como uma data class.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;data class&lt;/span&gt; &lt;span class="nc"&gt;Food&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;chef&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois temos que criar uma lista usando nosso modelo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;FoodList&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;listOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;  
    &lt;span class="nc"&gt;Food&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Feijão tropeiro"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Ana Laura"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  
    &lt;span class="nc"&gt;Food&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Frango caipira"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Julio"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  
    &lt;span class="nc"&gt;Food&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Pamonha"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Gabriel"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, vamos para a parte de vincular o conjunto de dados a uma representação visual com o ViewHolder.&lt;/p&gt;

&lt;p&gt;Os &lt;code&gt;ViewHolders&lt;/code&gt; atuam como um cache para elementos visuais, armazenando referências às &lt;code&gt;views&lt;/code&gt; no layout para otimizar a atualização da interface gráfica. &lt;em&gt;(Lembre-se que estamos falando de dispositivos móveis, ou seja a capacidade é muito menor que de um computador)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;São elementos que serão exibidos, exigindo a criação de uma classe &lt;code&gt;ViewHolder&lt;/code&gt; que estende &lt;code&gt;RecyclerView.ViewHolder&lt;/code&gt;. Esta classe recebe um parâmetro por padrão que é o &lt;code&gt;itemView&lt;/code&gt; e também deve ter um método "bind", responsável por vincular dados, associando elementos visuais aos itens do conjunto de dados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FoodViewHolder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;itemView&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;RecyclerView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ViewHolder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;itemView&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;food&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Food&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
        &lt;span class="n"&gt;itemView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;findViewById&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;TextView&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="nc"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;foodName&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;food&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;  
        &lt;span class="n"&gt;itemView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;findViewById&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;TextView&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="nc"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;foodChef&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;food&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chef&lt;/span&gt;  
    &lt;span class="p"&gt;}&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Ah, perceba que ali a gente já selecionou esses dois ID's &lt;code&gt;foodName&lt;/code&gt; e &lt;code&gt;foodChef&lt;/code&gt;, mas ainda não os criamos no nosso XML. Vamos conversar sobre isso:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Agora, o que precisamos fazer é criar o layout do nosso &lt;code&gt;ViewHolder&lt;/code&gt;, ou seja, qual será o layout de cada item do nosso &lt;code&gt;RecyclerView&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Este layout é criado da mesma forma que criamos qualquer outra &lt;code&gt;Activity&lt;/code&gt;, criando um xml de layout com o nome de &lt;code&gt;food_item.xml&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;/span&gt;  
&lt;span class="nt"&gt;&amp;lt;LinearLayout&lt;/span&gt; &lt;span class="na"&gt;xmlns:android=&lt;/span&gt;&lt;span class="s"&gt;"http://schemas.android.com/apk/res/android"&lt;/span&gt;  
    &lt;span class="na"&gt;android:layout_width=&lt;/span&gt;&lt;span class="s"&gt;"match_parent"&lt;/span&gt;  
    &lt;span class="na"&gt;android:layout_height=&lt;/span&gt;&lt;span class="s"&gt;"wrap_content"&lt;/span&gt;  
    &lt;span class="na"&gt;android:orientation=&lt;/span&gt;&lt;span class="s"&gt;"vertical"&lt;/span&gt;  
    &lt;span class="na"&gt;android:padding=&lt;/span&gt;&lt;span class="s"&gt;"10dp"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;  

    &lt;span class="nt"&gt;&amp;lt;TextView&lt;/span&gt;        &lt;span class="na"&gt;android:id=&lt;/span&gt;&lt;span class="s"&gt;"@+id/foodName"&lt;/span&gt;  
        &lt;span class="na"&gt;android:layout_width=&lt;/span&gt;&lt;span class="s"&gt;"match_parent"&lt;/span&gt;  
        &lt;span class="na"&gt;android:layout_height=&lt;/span&gt;&lt;span class="s"&gt;"wrap_content"&lt;/span&gt;  
        &lt;span class="na"&gt;android:textSize=&lt;/span&gt;&lt;span class="s"&gt;"20sp"&lt;/span&gt;  
        &lt;span class="na"&gt;android:textStyle=&lt;/span&gt;&lt;span class="s"&gt;"bold"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;  

    &lt;span class="nt"&gt;&amp;lt;TextView&lt;/span&gt;        &lt;span class="na"&gt;android:id=&lt;/span&gt;&lt;span class="s"&gt;"@+id/foodChef"&lt;/span&gt;  
        &lt;span class="na"&gt;android:layout_width=&lt;/span&gt;&lt;span class="s"&gt;"match_parent"&lt;/span&gt;  
        &lt;span class="na"&gt;android:layout_height=&lt;/span&gt;&lt;span class="s"&gt;"wrap_content"&lt;/span&gt;  
        &lt;span class="na"&gt;android:textSize=&lt;/span&gt;&lt;span class="s"&gt;"15sp"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;  
&lt;span class="nt"&gt;&amp;lt;/LinearLayout&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Agora que estabelecemos nosso &lt;code&gt;ViewHolder&lt;/code&gt;, avançamos para a construção do &lt;code&gt;Adapter&lt;/code&gt;. Nesse processo, vamos sobrescrever os métodos necessários para associar os dados do tipo &lt;code&gt;Food&lt;/code&gt; ao nosso layout. &lt;/p&gt;

&lt;p&gt;Imagine o &lt;code&gt;Adapter&lt;/code&gt; como um intermediário que conecta nossos dados de comida ao layout. &lt;/p&gt;

&lt;p&gt;Para começar, criamos a classe &lt;code&gt;FoodAdapter&lt;/code&gt;, que recebe uma lista de objetos &lt;code&gt;Food&lt;/code&gt; e estende a classe &lt;code&gt;RecyclerView.Adapter&amp;lt;FoodViewHolder&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Esta classe é como um organizador que recebe uma lista de comidas, que chamamos de "conjunto de dados", e ela é especializada para trabalhar com o nosso &lt;code&gt;ViewHolder&lt;/code&gt; de comidas, o &lt;code&gt;FoodViewHolder&lt;/code&gt;. É basicamente uma maneira de dizer ao sistema como os dados (comidas) devem ser exibidos no layout.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FoodAdapter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;foods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Food&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;RecyclerView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Adapter&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;FoodViewHolder&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Antes da gente continuar, preciso te explicar o que é o &lt;code&gt;onCreateViewHolder()&lt;/code&gt;: Este método é acionado durante a criação do &lt;code&gt;ViewHolder&lt;/code&gt; e é responsável por gerar os elementos visuais para cada item da lista. &lt;/p&gt;

&lt;p&gt;O termo utilizado para descrever esse processo é "Inflate". &lt;br&gt;
&lt;em&gt;Em outras palavras, o método realiza a criação visual de cada elemento da lista, preparando-os para serem exibidos no &lt;code&gt;RecyclerView&lt;/code&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;onCreateViewHolder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;ViewGroup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;viewType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;FoodViewHolder&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="cm"&gt;/*estamos criando um Inflater, e gerando um inflate, que é o método que cria os elementos, tendo como primeiro parâmetro o layout do elemento que deve ser replicado. Em nosso caso, o food_item */&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;view&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LayoutInflater&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;inflate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;food_item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;FoodViewHolder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👀&lt;em&gt;ps: isso será um método da classe &lt;code&gt;FoodAdapter&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Agora, precisamos sobrescrever o método de vínculo &lt;code&gt;onBindViewHolder()&lt;/code&gt;. Ele recebe como parâmetro o nosso &lt;code&gt;ViewHolder&lt;/code&gt; de comidas e chama o nosso método &lt;code&gt;bind()&lt;/code&gt; para cada um de nossos elementos de lista. O método &lt;code&gt;bind&lt;/code&gt; é uma convenção usada para associar os dados de um item específico do conjunto de dados ao &lt;code&gt;ViewHolder&lt;/code&gt; correspondente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;onBindViewHolder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;holder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;FoodViewHolder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  

    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;food&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;foods&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  

    &lt;span class="n"&gt;holder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;food&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👀&lt;em&gt;ps: Lembra que lá na nossa classe &lt;code&gt;FoodViewHolder&lt;/code&gt; tem um método bind, o que será que ele faz mesmo? xD&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A classe &lt;code&gt;FoodAdapter&lt;/code&gt; herda de &lt;code&gt;RecyclerView.Adapter&lt;/code&gt; e implementa alguns métodos abstratos necessários, como &lt;code&gt;getItemCount()&lt;/code&gt; que retorna a quantidade de itens.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;getItemCount&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;foods&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora que já fizemos tudo isso, podemos vincular o &lt;code&gt;Adapter&lt;/code&gt; ao &lt;code&gt;RecyclerView&lt;/code&gt; que criamos lá atrás:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="c1"&gt;// essa variável aqui foi criada lá atrás&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;recyclerView&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;RecyclerView&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;findViewById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recyclerView&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;//criando o Adapter a partir da nossa lista de comidas&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;adapter&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FoodAdapter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;foodList&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;//vinculando o adapter ao RecyclerView&lt;/span&gt;
&lt;span class="n"&gt;recyclerView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;adapter&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;adapter&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;E fim, temos uma lista criada 🥰&lt;/p&gt;

&lt;p&gt;Eu criei um &lt;a href="https://github.com/anabergerr/foodlist-example" rel="noopener noreferrer"&gt;repositório no github&lt;/a&gt; com o código e &lt;em&gt;&lt;del&gt;com um desenho não muito bom&lt;/del&gt;&lt;/em&gt; que eu fiz pra ajudar entender. &lt;/p&gt;

&lt;p&gt;Se você leu até o final reage com um 💟 se não, não precisa reagir :(.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;bjs bjs e até a próxima&lt;/code&gt;&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>kotlin</category>
      <category>android</category>
    </item>
    <item>
      <title>Como Foi O Front In Floripa? 🤔</title>
      <dc:creator>Ana Laura</dc:creator>
      <pubDate>Tue, 28 Nov 2023 15:10:50 +0000</pubDate>
      <link>https://dev.to/analaura/como-foi-o-front-in-floripa-4240</link>
      <guid>https://dev.to/analaura/como-foi-o-front-in-floripa-4240</guid>
      <description>&lt;p&gt;Eai, como cês tão? &lt;/p&gt;

&lt;p&gt;Hoje vim aqui pra contar um pouco da minha experiência no &lt;strong&gt;Front In Floripa&lt;/strong&gt;. Modéstia parte, eu estava em ótimas companhias, uma delas era o &lt;a class="mentioned-user" href="https://dev.to/1cadumagalhaes"&gt;@1cadumagalhaes&lt;/a&gt;, a &lt;a href="https://twitter.com/techlys" rel="noopener noreferrer"&gt;Lys&lt;/a&gt; ambos criam conteúdos tech e o Anderson que é um outro amigo dev!!! Só gente BOA DEMAIS.&lt;/p&gt;

&lt;p&gt;Então bora lá, como foi o Front In Floripa?&lt;/p&gt;

&lt;h2&gt;
  
  
  Networking 😎
&lt;/h2&gt;

&lt;p&gt;Esses eventos são bons para fazer o famoso &lt;code&gt;networking&lt;/code&gt;. Trocar uma ideia com o pessoal que está lá representando empresas parceiras, participantes do evento ou as pessoas que apresentaram alguma palestra, com toda certeza agrega e muito.&lt;/p&gt;

&lt;p&gt;Lá pude conhecer algumas pessoas e trocar bastante experiência e aprendizado. Entre essas pessoas conversei com duas pessoas da Stone. Ambas muito queridas e atenciosas. Uma delas é desenvolvedora front-end, e a outra Tech Recruiter. Foi uma experiência muito legal, pois elas me forneceram várias informações sobre a Stone, como o funcionamento do processo seletivo da empresa, as tecnologias que utilizam (stacks), e falaram um pouco sobre o time técnico. Agradeço muito, meninas; sem dúvida, nossa conversa foi um diferencial no meu dia.&lt;/p&gt;

&lt;p&gt;Sempre gostei de me comunicar e trocar experiência/ideia com outras pessoas e isso foi muito importante quando eu decidi entrar na área de tecnologia. Conversar com outras pessoas é e sempre será muito bom. &lt;br&gt;
Essa troca que existe foi e ainda é fundamental na minha trajetória.&lt;/p&gt;

&lt;p&gt;Então apenas reforçando, façam networking! 😌&lt;/p&gt;

&lt;h2&gt;
  
  
  Palestra - Conteúdos 🤖
&lt;/h2&gt;

&lt;p&gt;Cheguei bem na hora que o &lt;a href="https://www.linkedin.com/in/gabrieldonadeldallagnol/" rel="noopener noreferrer"&gt;Gabriel Donadel&lt;/a&gt; estava falando sobre &lt;code&gt;React Native&lt;/code&gt;. A palestra foi tão boa que sai de lá com vontade e curiosidade de aprender mais sobre. Ele falou sobre a importância de aplicações "universais" aplicações que podem ser executadas em diferentes plataformas de maneira eficiente, sem a necessidade de reescrever o código para cada sistema operacional específico. Ele também falou sobre a &lt;code&gt;Expo&lt;/code&gt; que é uma plataforma de código aberto para criar aplicativos nativos universais com React. &lt;code&gt;Expo&lt;/code&gt; funciona em Android, iOS e na web. Se quiser saber mais sobre &lt;a href="https://github.com/expo/expo" rel="noopener noreferrer"&gt;ta aqui o link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Assisti também a palestra da &lt;a href="https://www.linkedin.com/in/fernanda-kipper/" rel="noopener noreferrer"&gt;Fernanda Kipper&lt;/a&gt; ela falou bastante sobre a importância da padronização para a melhora de processos em empresas grandes. Trouxe todos os prós e contras desse tipo de decisão e isso foi super legal. Pude aprender bastante sobre como funciona alguns processos em empresas com times técnicos que são enormes.&lt;/p&gt;

&lt;p&gt;O &lt;a href="https://www.linkedin.com/in/paulo-cesar-prado-jr/" rel="noopener noreferrer"&gt;Paulo Cesar Prado &lt;/a&gt;trouxe um assunto super legal e importante que são Testes A/B. Ele trouxe algumas experiência vividas na Globo em relação a esse tipo de teste, o que foi bem interessante. Também falou dos erros mais comuns ao realizar esse tipo de teste, como por exemplo: Definir métricas ruins, executar vários testes, etc. Gostei demais da palestra. Eu tinha um conhecimento bem superficial sobre o assunto, então foi um ótimo momento para aprender um pouco mais.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code in The Dark 😈
&lt;/h2&gt;

&lt;p&gt;Dando contexto sobre o que é o tal do &lt;strong&gt;Code in The Dark&lt;/strong&gt;, de forma resumida é literalmente codar no escuro 😅. Você precisa desenvolver um layout proposto por eles, sem ver o que tá sendo feito ou seja, &lt;em&gt;vai codando ali sem ver o resultado&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;O role é fazer tudo usando apenas HTML e CSS. E ah! sem autocomplete (isso me pegou DEMAIS rs), a dúvida era: &lt;em&gt;A tag &lt;code&gt;style&lt;/code&gt; fica dentro da tag &lt;code&gt;head&lt;/code&gt;, né?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Foi um momento legal demais, super indico viver essa experiência se um dia tiver oportunidade. Confesso que da uma certa insegurança mas ah, vai assim mesmo que é legal!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://beacons.ai/codeinthedarkbrasil" rel="noopener noreferrer"&gt;Aqui&lt;/a&gt; tem mais informação sobre e o &lt;a href="https://github.com/codeinthedark/editor" rel="noopener noreferrer"&gt;editor/IDE&lt;/a&gt; deles é open source, vale a pena dar uma olhada, rola até de treinar ein rs :) &lt;/p&gt;




&lt;p&gt;Pessoas lindas e legais que me acompanham aqui, queria compartilhar um pouco como foi o Front in Floripa, e pra não perder o costume:&lt;/p&gt;

&lt;p&gt;Se você leu até o final reage com um 💟 se não, não precisa reagir :(.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;bjs bjs e até a próxima&lt;/code&gt;. &lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Tentando Conquistar o Mundo da Programação: Dicas para Resolver Problemas</title>
      <dc:creator>Ana Laura</dc:creator>
      <pubDate>Thu, 02 Nov 2023 05:28:59 +0000</pubDate>
      <link>https://dev.to/analaura/tentando-conquistar-o-mundo-da-programacao-dicas-para-resolver-problemas-2cfk</link>
      <guid>https://dev.to/analaura/tentando-conquistar-o-mundo-da-programacao-dicas-para-resolver-problemas-2cfk</guid>
      <description>&lt;p&gt;Eai, cês tão bem? &lt;/p&gt;

&lt;p&gt;Eu gosto muito de escrever sobre coisas que acabo vivenciando e pensando: &lt;em&gt;&lt;strong&gt;E se eu fizer um post pra falar disso?&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;No meu trabalho, me deparo frequentemente com desafios que são bem comuns para quem está começando a explorar o mundo da programação. São aqueles obstáculos típicos que, de vez em quando, nos deixam um tanto desanimados na nossa jornada nesse universo meio "maluco" que é a programação.&lt;/p&gt;

&lt;p&gt;Então, eu tô aqui hoje para conversarmos um pouco sobre essas situações e, quem sabe, eu consiga te dar uma mãozinha nessa jornada. :) &lt;/p&gt;

&lt;h2&gt;
  
  
  Dicas e Lembretes Essenciais 📝
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;É perfeitamente normal ter dúvidas, seja quando você está aprendendo ou mesmo depois de algum tempo. Ter dúvidas simplesmente significa que existe algum conhecimento que ainda não foi adquirido. Portanto, não hesite em fazer perguntas e buscar esclarecimentos sempre que necessário.&lt;/li&gt;
&lt;li&gt;A aprendizagem muitas vezes requer repetição. Ver um conteúdo uma vez, duas vezes, ou até mesmo por vários dias seguidos não garante um conhecimento sólido sobre o assunto. É importante continuar praticando e revisando.&lt;/li&gt;
&lt;li&gt;Evite comparar sua velocidade de aprendizado com a de outras pessoas, acredite, não vale a pena e só gera frustração. Cada um tem seu próprio ritmo de aprendizado, e o importante é progredir de acordo com suas próprias metas e necessidades.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  "Travei" num desafio/problema. E agora? 🥶
&lt;/h2&gt;

&lt;p&gt;Para tornar minha missão de ajudar a resolver seu desafio sem nem mesmo ver seu código mais eficaz, vou começar fazendo algumas perguntas:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como você iniciou a resolução desse problema?&lt;/strong&gt; ❓&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Comecei a codar sem dividir em partes e estou perdido, sem saber onde está o problema. 🤯&lt;/li&gt;
&lt;li&gt;Dividi em partes e estou enfrentando um problema em uma etapa específica. 🤧&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se você escolheu a primeira alternativa, vamos começar dividindo seu problema em partes. Essa prática é muito útil; eu pessoalmente a utilizo muito. Pego uma folha de papel e escrevo tudo o que meu programa deveria fazer, só depois parto para o código.&lt;/p&gt;

&lt;p&gt;Para ser mais assertiva, vou dar um exemplo de como podemos fazer isso:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Desafio: Calcular a Média de uma Lista de Números&lt;/strong&gt; 🤓&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Dividindo meu problema:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Definir o Objetivo:&lt;/strong&gt; O objetivo é calcular a média de uma lista de números.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Entrada de Dados:&lt;/strong&gt; Identificar a entrada necessária para o problema. Neste caso, é uma lista de números.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Processamento dos Dados:&lt;/strong&gt; Dividir o problema em etapas menores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inicializar uma variável &lt;code&gt;total&lt;/code&gt; como 0 para rastrear a soma dos números.&lt;/li&gt;
&lt;li&gt;Usar um loop para percorrer a lista de números.&lt;/li&gt;
&lt;li&gt;Adicionar cada número à variável &lt;code&gt;total&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Calcular a média dividindo o &lt;code&gt;total&lt;/code&gt; pelo número de elementos na lista.&lt;/li&gt;
&lt;li&gt;Retornar o valor da média.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Saída de Dados:&lt;/strong&gt; No final, você obtém a média dos números e a imprime na tela.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Aqui nós dividimos o problema em etapas menores e ajuda a organizar a resolução do problema de maneira mais eficaz. Cada etapa lida com uma parte específica do problema, tornando-o mais "gerenciável" e fácil de implementar.&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Isso foi uma das formas que eu pensei em como resolver esse desafio, mas existem outras formas. :)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Tenta resolver o desafio e depois, se quiser me conta como foi!&lt;/p&gt;




&lt;p&gt;Se você respondeu a segunda alternativa, vem comigo que eu vou tentar te ajudar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compreenda o problema: Certifique-se de entender completamente o problema antes de começar a escrever código.&lt;/li&gt;
&lt;li&gt;Divida em partes: Divida o novo problema em partes menores e bem definidas.&lt;/li&gt;
&lt;li&gt;Faça perguntas: Se estiver travado em uma parte, faça perguntas específicas para entender a dificuldade.&lt;/li&gt;
&lt;li&gt;Pesquisa: Busque em recursos como documentação, tutoriais, para obter informações, use alguma das perguntas feitas no tópico acima para pesquisar no Google ou até mesmo usar nosso amigo chat GPT. &lt;/li&gt;
&lt;li&gt;Pseudocódigo: Crie um pseudocódigo ou fluxograma para visualizar a lógica da solução.&lt;/li&gt;
&lt;li&gt;Revisão: Explique sua abordagem lógica a alguém para identificar problemas, isso me ajuda MUITO. Eu converso até meio sozinha as vezes, rs. 😅&lt;/li&gt;
&lt;li&gt;Testes: À medida que avança na resolução do problema, teste partes individuais do seu código e, sempre que possível, exiba as saídas na tela. Isso ajuda você verificar se cada parte do código funciona conforme o esperado e a identificar problemas mais cedo. Isso acontece bastante, quando achamos que uma variável está retornando um valor, mas na realidade, está nos surpreendendo com outro. &lt;/li&gt;
&lt;li&gt;Depuração: Utilize ferramentas de depuração para rastrear o comportamento do programa.&lt;/li&gt;
&lt;li&gt;Seja paciente: Todos enfrentam desafios, seja persistente e paciente.&lt;/li&gt;
&lt;li&gt;Aprenda com os erros: Veja os desafios como oportunidades de aprendizado e crescimento profissional. &lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;O livro 'Fomos Maus Alunos' traz uma reflexão muito interessante sobre o erro. Vou deixar um trecho desse livro aqui para finalizar este conteúdo. ❤️&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Faz parte da aventura chegar e dizer: Estava errado. Vou dar um exemplo. Uma pessoa se dedica à exploração de cavernas. Há uma bifurcação. Não sabe qual delas seguir. Assim, vai na sorte. Depois de muito caminhar, chega a um beco sem saída. Aquele corredor da caverna não leva a lugar algum. Ela volta e escreve à entrada da bifurcação: Beco sem saída. Essa informação é importante? É conhecimento? Importantíssima para os outros que virão depois dela. Conhecimento de que aquele caminho vai dar em nada. Aquelas palavras lhes pouparão trabalho. Um doutorando se propõe fazer uma pesquisa. Pesquisa durante cinco anos. Ao final de cinco anos, verifica que todas as suas hipóteses estavam erradas. Para mim seria perfeitamente válido que ele escrevesse, como conclusão de sua tese: Depois de cinco anos de pesquisa verifiquei que todas as hipóteses estavam erradas. Isso é conhecimento.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;&lt;del&gt;Se você leu até o final reage com um 💟 se não, não precisa reagir :(.&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/analaura" rel="noopener noreferrer"&gt;&lt;br&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%2Fq5lmes6jh7hxyeqiuvd0.jpg" alt="Imagem com a logo da plataforma Buy Me a Coffee" width="170" height="37"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>braziliandevs</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>Comece Por Aqui: Conceitos Básicos Kotlin Parte I</title>
      <dc:creator>Ana Laura</dc:creator>
      <pubDate>Sun, 29 Oct 2023 00:31:30 +0000</pubDate>
      <link>https://dev.to/analaura/explorando-os-conceitos-basicos-do-kotlin-parte-i-2pll</link>
      <guid>https://dev.to/analaura/explorando-os-conceitos-basicos-do-kotlin-parte-i-2pll</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;💟 Eai, como cês tão? &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Essa é a primeira parte de um conteúdo que será dividido em duas partes, onde exploraremos a documentação do Kotlin. &lt;/p&gt;

&lt;p&gt;Antes de criar este conteúdo, pesquisei como poderia contribuir com a tradução da documentação oficial, mas em resumo, eles incentivam traduções, porém a hospedagem e publicação da tradução são de responsabilidade do tradutor, e ela não será incorporada ao site oficial da linguagem Kotlin. Mais informações, &lt;a href="https://kotlinlang.org/docs/contribute.html#translate-documentation-to-other-languages" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Ressalto a importância de também consultar a documentação oficial, uma vez que essa fonte é regularmente atualizada e abriga uma vasta quantidade de informações detalhadas. Além disso, a &lt;a href="https://kotlinlang.org/docs/home.html" rel="noopener noreferrer"&gt;documentação do Kotlin&lt;/a&gt; é maravilhosa.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A proposta dessa primeira parte é falar sobre os fundamentos do Kotlin, abordando a parte inicial e básica. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bônus:&lt;/strong&gt;  Ao final, compartilharei alguns recursos da IDE IntelliJ que podem ajudar ainda mais na sua aprendizagem sobre a linguagem. 🤯&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/10mzF0YmVmZNuw/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/10mzF0YmVmZNuw/giphy.gif" width="221" height="194"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ana, sobre o que vamos falar? Nesta primeira parte, vou abordar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Por que Kotlin?&lt;/li&gt;
&lt;li&gt;
Variáveis &lt;/li&gt;
&lt;li&gt;Tipos Básicos&lt;/li&gt;
&lt;li&gt;Coleções&lt;/li&gt;
&lt;li&gt;Fluxo de Controle&lt;/li&gt;
&lt;li&gt;Funções&lt;/li&gt;
&lt;li&gt;Bônus&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a id="conhecendo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que Kotlin?
&lt;/h2&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%2Fuvxxjse1fnqcdrzotd3j.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%2Fuvxxjse1fnqcdrzotd3j.jpg" alt=" " width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kotlin é uma linguagem de programação de código aberto desenvolvida pela JetBrains.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;É projetada para ser compatível com o Java e é popular para o desenvolvimento de aplicativos Android.&lt;/li&gt;
&lt;li&gt;É concisa, segura, legível e expressiva.&lt;/li&gt;
&lt;li&gt;Resolve limitações do Java e é executada na JVM.&lt;/li&gt;
&lt;li&gt;Destaca-se por sua segurança em relação a referências nulas.&lt;/li&gt;
&lt;li&gt;Permite a interoperabilidade com o Java e é compatível com bibliotecas existentes.&lt;/li&gt;
&lt;li&gt;Ampla adoção na comunidade de desenvolvimento, especialmente para aplicativos Android.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Meu primeiro "Hello, World" em Kotlin
&lt;/h2&gt;

&lt;p&gt;💀 Olha só, para evitar possíveis "maldições" - já que há uma lenda que afirma que começar o aprendizado sem um simples "Hello, World!" pode dificultar a compreensão dos princípios básicos - vamos iniciar com um "Hello World" em Kotlin. &lt;del&gt;Não que eu acredite, mas vai que né&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;E para isso, podemos utilizar o &lt;a href="https://play.kotlinlang.org" rel="noopener noreferrer"&gt;"playground"&lt;/a&gt; do Kotlin, que permite que você crie e execute códigos por lá. Legal, né?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello, World!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Em Kotlin a palavra-chave &lt;code&gt;fun&lt;/code&gt; é usada para declarar uma função.&lt;/li&gt;
&lt;li&gt;A função &lt;code&gt;main()&lt;/code&gt; é onde o seu programa começa.&lt;/li&gt;
&lt;li&gt;O corpo de uma função é escrito entre chaves &lt;code&gt;{}&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;As funções &lt;code&gt;println()&lt;/code&gt; e &lt;code&gt;print()&lt;/code&gt; imprimem seus argumentos na saída padrão.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;del&gt;Me lembrou um pouco Python ou eu to doida?! 😅&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;&lt;a id="variaveis"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Variáveis
&lt;/h2&gt;

&lt;p&gt;🔹 Todo programa precisa ser capaz de armazenar dados, e as variáveis nos ajudam a fazer isso. Em Kotlin, você pode declarar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Variáveis que não podem ser mudadas, utilizando &lt;code&gt;val&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Variáveis mutáveis, ou seja, que podem ser alteradas, utilizando &lt;code&gt;var&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Para atribuir um valor, usamos o operador de atribuição &lt;code&gt;=&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;age&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt; &lt;span class="c1"&gt;//imutável&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="py"&gt;age&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="c1"&gt;//mutável&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;As variáveis podem ser declaradas no início do seu programa, fora da função main(), por exemplo. Quando você as declara dessa forma, elas são consideradas variáveis globais.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;E aqui segue a recomendação de sempre declararmos variáveis utilizando &lt;code&gt;val&lt;/code&gt;. Utilizar &lt;code&gt;var&lt;/code&gt; somente se necessário.&lt;/p&gt;

&lt;h2&gt;
  
  
  Template string
&lt;/h2&gt;

&lt;p&gt;🔹 Sabe aqueles momentos em que precisamos adicionar uma ou mais variáveis em uma string? Então, é ai que as templates de strings podem ser bem úteis. &lt;/p&gt;

&lt;p&gt;Vale lembrar que em Kotlin, um valor de string é uma sequência de caracteres entre aspas duplas ". Por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Ana Laura Reis"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As templates strings sempre começam com um &lt;code&gt;$&lt;/code&gt;. Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;age&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;

&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Ana Laura Reis"&lt;/span&gt;

&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;template&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"My name is $name and I am $age years old"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse exemplo, &lt;code&gt;$name&lt;/code&gt; será substituído pelo valor da variável &lt;code&gt;name&lt;/code&gt; e &lt;code&gt;$age&lt;/code&gt; pelo valor da variável &lt;code&gt;age&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Se quiser saber mais sobre template string, dê uma olhada &lt;a href="https://kotlinlang.org/docs/strings.html#string-templates" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a id="tipos"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tipos básicos
&lt;/h2&gt;

&lt;p&gt;🔹 Os tipos são importantes para entendermos o que estamos armazenando em uma variável ou até mesmo quais funções e propriedades aquele dado possui.&lt;/p&gt;

&lt;p&gt;Nos exemplos acima já foi possível vermos dois tipos, &lt;code&gt;int&lt;/code&gt; e &lt;code&gt;string&lt;/code&gt;. A variável &lt;code&gt;name&lt;/code&gt; é do tipo &lt;code&gt;string&lt;/code&gt; e &lt;code&gt;age&lt;/code&gt; do tipo &lt;code&gt;int&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O Kotlin possui a habilidade de deduzir o tipo de dados de uma variável e isso é chamado de inferência de tipo.&lt;/p&gt;

&lt;p&gt;Quando você atribui um valor inteiro à variável &lt;code&gt;age&lt;/code&gt;, o Kotlin infere que &lt;code&gt;age&lt;/code&gt; possui um tipo de dado numérico, especificamente do tipo &lt;code&gt;Int&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Tá Ana, e o que isso significa na prática?&lt;/em&gt; Isso significa que o compilador &lt;em&gt;"sabe"&lt;/em&gt;  que você pode realizar operações aritméticas, como adição, subtração, multiplicação ou divisão, com a variável &lt;code&gt;age&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Essa inferência de tipo é uma das características poderosas do Kotlin, pois permite que você escreva código de forma concisa e legível, sem precisar especificar explicitamente o tipo de dados a todo momento. &lt;/p&gt;

&lt;p&gt;No geral, Kotlin possui os seguintes tipos básicos:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tipo&lt;/th&gt;
&lt;th&gt;Descrição&lt;/th&gt;
&lt;th&gt;Exemplo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Int&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Números inteiros&lt;/td&gt;
&lt;td&gt;&lt;code&gt;42&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Long&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Números inteiros longos&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1234567890L&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Float&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Números de ponto flutuante de precisão simples&lt;/td&gt;
&lt;td&gt;&lt;code&gt;3.14f&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Double&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Números de ponto flutuante de dupla precisão&lt;/td&gt;
&lt;td&gt;&lt;code&gt;3.14&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Char&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Caractere&lt;/td&gt;
&lt;td&gt;&lt;code&gt;'a'&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sequência de caracteres&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"Olá, mundo!"&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Boolean&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Valor lógico (verdadeiro ou falso)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;true&lt;/code&gt; ou &lt;code&gt;false&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Para saber mais sobre &lt;a href="https://kotlinlang.org/docs/basic-types.html" rel="noopener noreferrer"&gt;tipos básicos consulte a documentação&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;E se eu quiser iniciar uma variável sem necessariamente atribuir um valor? 🤔&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="c1"&gt;// variável declarada sem inicialização/sem valor atribuído&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;age&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;

&lt;span class="c1"&gt;// variável inicializada/atribuindo o valor 25 à variável age&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;age&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;

&lt;span class="c1"&gt;// declarando tipo e atribuindo valor&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Ana"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Acho que o exemplo conseguiu explicar bem!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;🧠 &lt;a href="https://kotlinlang.org/docs/kotlin-tour-basic-types.html#practice" rel="noopener noreferrer"&gt;Agora faça os exercícios para praticar o que aprendemos até aqui&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a id="colecoes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Coleções
&lt;/h2&gt;

&lt;p&gt;🔹 Lembra das listas, arrays? Os famosos tipos de dados que utilizamos para agrupar uma quantidade &lt;code&gt;n&lt;/code&gt; de dados.&lt;/p&gt;

&lt;p&gt;Em Kotlin temos algumas estruturas de dados para agrupar itens:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Coleção&lt;/th&gt;
&lt;th&gt;Descrição&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;List&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Coleção ordenada de elementos, pode conter duplicatas. Permite acesso por índices.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Set&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Coleção não ordenada de elementos únicos.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Map&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Coleção de pares chave-valor, onde cada chave é única.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ArrayList&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Implementação modificável de uma lista usando um array.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LinkedList&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Implementação modificável de uma lista usando uma estrutura de lista encadeada.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;HashSet&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Implementação de um conjunto usando uma tabela de dispersão para armazenar elementos únicos.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TreeSet&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Implementação de um conjunto usando uma estrutura de árvore balanceada para armazenar elementos únicos, mantendo a ordem.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;HashMap&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Implementação de um mapa usando uma tabela de dispersão para armazenar pares chave-valor, com chaves únicas.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TreeMap&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Implementação de um mapa usando uma estrutura de árvore balanceada para armazenar pares chave-valor, mantendo a ordem.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Falaremos mais detalhadamente sobre: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;List&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Set&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Map&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Para saber mais sobre os outros tipo, consulte a documentação oficial &lt;del&gt;(ou comenta aqui, quem sabe crio um conteúdo sobre isso)&lt;/del&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. List
&lt;/h3&gt;

&lt;p&gt;Podemos ter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uma coleção ordenada de elementos.&lt;/li&gt;
&lt;li&gt;Permite elementos duplicados.&lt;/li&gt;
&lt;li&gt;Os elementos podem ser acessados por índices.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 Para criar uma lista que não pode ser modificada (List), você utiliza a função &lt;code&gt;listOf()&lt;/code&gt; e se quiser criar uma lista que pode ser modificada (MutableList), você utiliza a função &lt;code&gt;mutableListOf()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Caso queira dizer o tipo dos elementos da sua lista, você pode fazer isso usando &lt;code&gt;&amp;lt;&amp;gt;&lt;/code&gt;, vou mostrar alguns exemplos abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Lista imutável&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;listImmutable&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;listOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Ana"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Gabriel"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Maria"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;//Lista mutável e tipada&lt;/span&gt;

&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;listMutable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="nc"&gt;MutableList&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;mutableListOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Ana"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Gabriel"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Maria"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Podemos acessar qualquer elemento da lista através de seu índice:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;favoriteMusics&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;lisOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Rap"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Funk"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Pagode"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;favoriteMusics&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;// acessando o item "Rap" da minha lista&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Podemos acessar o primeiro e o último elemento de uma lista utilizando as funções:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.first()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.last()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Os dois exemplos acima são &lt;em&gt;funções de extensão&lt;/em&gt;. Em resumo, os métodos são ações diretamente ligadas a uma classe, enquanto as funções de extensão são novas ações que você pode adicionar a uma classe existente sem modificar a classe original. Eles permitem estender a funcionalidade da classe de uma forma mais flexível.&lt;/p&gt;

&lt;p&gt;Para entender melhor sobre essas funções dê uma olhada &lt;a href="https://kotlinlang.org/docs/extensions.html#extensions-are-resolved-statically" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Outra coisa legal que conseguimos pra fazer é verificar se existe um item em uma lista utilizando &lt;code&gt;in&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Rap"&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;favoriteMusics&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Também podemos adicionar e remover itens de uma lista, utilizando o &lt;code&gt;.add()&lt;/code&gt; e &lt;code&gt;.remove()&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Adiciona "Samba" no final da lista&lt;/span&gt;

&lt;span class="n"&gt;favoriteMusics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Samba"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// Remove "Rap" da lista&lt;/span&gt;

&lt;span class="n"&gt;favoriteMusics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Rap"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Set
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Uma coleção que não mantém uma ordem específica.&lt;/li&gt;
&lt;li&gt;Como os conjuntos não são ordenados, você não consegue acessar um item através do seu índice.&lt;/li&gt;
&lt;li&gt;Contém apenas elementos únicos, não permitindo duplicatas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Assim como nas listas também podemos criar um &lt;code&gt;set&lt;/code&gt; mutável ou imutável:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Imutável &lt;/span&gt;

&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;fruits&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;setOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"banana"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"morango"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"pêra"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;//Mutável&lt;/span&gt;

&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;newFruits&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;MutableSet&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;mutableSetOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"banana"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"morango"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"pêra"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"maçã"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;&lt;strong&gt;Ah algo interessante é que o &lt;code&gt;set&lt;/code&gt; contêm apenas elementos únicos, todo item duplicado é descartado. 👀&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Também conseguimos usar as funções &lt;code&gt;add&lt;/code&gt; e &lt;code&gt;remove&lt;/code&gt; para adicionarmos e removermos algum item do nosso &lt;code&gt;set&lt;/code&gt;, caso ele seja mutável. &lt;/p&gt;

&lt;h3&gt;
  
  
  3. Map
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Uma coleção de pares chave-valor, onde cada chave é única.&lt;/li&gt;
&lt;li&gt;As chaves são usadas para acessar os valores associados.&lt;/li&gt;
&lt;li&gt;Não mantém uma ordem específica para os pares chave-valor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 Podemos imaginar um &lt;code&gt;map&lt;/code&gt; como um menu de comida. Você pode encontrar o preço (valor), encontrando a comida (chave) que deseja comer. Os mapas são úteis se você quiser procurar um valor sem usar um índice numerado, como em uma lista.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Imutável &lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;menu&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;mapOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"coxinha"&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"coquinha"&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"batata"&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// Isso aqui nos retorna: {coxinha=2, coquinha=3, batata=10}&lt;/span&gt;

&lt;span class="c1"&gt;//Mutável &lt;/span&gt;

&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;newMenu&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="nc"&gt;MutableMap&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;mapOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"esfirra"&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"coquinha"&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"brigadeiro"&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para acessar um valor em um Map, podemos utilizar colchetes &lt;code&gt;[]&lt;/code&gt; com sua chave, vamos supor que eu queria acessar o valor &lt;code&gt;brigadeiro&lt;/code&gt; do &lt;code&gt;map&lt;/code&gt; acima.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="n"&gt;newMenu&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"brigadeiro"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui também conseguimos usar as funções &lt;code&gt;add&lt;/code&gt; e &lt;code&gt;remove&lt;/code&gt;.😉&lt;/p&gt;

&lt;p&gt;Se quisermos verificar se uma chave específica já existe em um &lt;code&gt;map&lt;/code&gt;, utilizamos a função &lt;code&gt;.containsKey()&lt;/code&gt;. Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="n"&gt;novoMenu&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;containsKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Quibe"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;//false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se quisermos obter as chaves ou valores de um &lt;code&gt;Map&lt;/code&gt;, usamos as propriedades &lt;code&gt;keys&lt;/code&gt; e &lt;code&gt;values&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;menu&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;mapOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"coxinha"&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"coquinha"&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"batata"&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;menu&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keys&lt;/span&gt; &lt;span class="c1"&gt;// [coxinha, coquinha, batata]&lt;/span&gt;
&lt;span class="n"&gt;menu&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt; &lt;span class="c1"&gt;// [2, 3, 10]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;&lt;code&gt;keys&lt;/code&gt; e &lt;code&gt;values&lt;/code&gt; são exemplos de propriedades de um objeto. Vamos falar mais disso na parte 2 desse conteúdo que será sobre &lt;code&gt;Classes&lt;/code&gt; 😊&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;🧠 &lt;a href="https://kotlinlang.org/docs/kotlin-tour-collections.html#practice" rel="noopener noreferrer"&gt;Agora faça os exercícios para praticar o que aprendemos até aqui&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a id="fluxo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Expressões condicionais﻿
&lt;/h2&gt;

&lt;p&gt;🔸 No Kotlin, podemos tomar decisões utilizando as estruturas &lt;code&gt;if&lt;/code&gt; ou &lt;code&gt;when&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;del&gt;Esse tal de &lt;code&gt;when&lt;/code&gt; foi uma novidade 😅&lt;/del&gt;. &lt;/p&gt;

&lt;p&gt;Na documentação é fortemente recomendado utilizar o &lt;code&gt;when&lt;/code&gt;, veja só:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Se você tiver que escolher entre &lt;code&gt;if&lt;/code&gt;e &lt;code&gt;when&lt;/code&gt;, recomendamos usar when, pois isso leva a programas mais robustos e seguros.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Usando o &lt;code&gt;if&lt;/code&gt;:
&lt;/h2&gt;

&lt;p&gt;Para usar o &lt;code&gt;if&lt;/code&gt;, coloque a expressão condicional entre parênteses () e a ação a ser executada se o resultado for verdadeiro entre chaves {}:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;check&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// O retorno será `1`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Usando &lt;code&gt;when&lt;/code&gt;:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;when&lt;/code&gt; quando você tiver uma expressão condicional com várias ramificações. &lt;code&gt;When&lt;/code&gt; pode ser usado tanto como uma declaração quanto como uma expressão.&lt;/li&gt;
&lt;li&gt;Aqui está um exemplo de como usar &lt;code&gt;when&lt;/code&gt; como uma declaração:&lt;/li&gt;
&lt;li&gt;Coloque a expressão condicional entre parênteses () e as ações a serem executadas dentro de chaves {}.&lt;/li&gt;
&lt;li&gt;Use " -&amp;gt; " em cada ramificação para separar cada condição de cada ação.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;text&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Hello"&lt;/span&gt;

&lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Verifica se o text é igual "1"&lt;/span&gt;
    &lt;span class="s"&gt;"1"&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"One"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;// Verifica se o text é igual a "Hello"&lt;/span&gt;
    &lt;span class="s"&gt;"Hello"&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Greeting"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;// Declaração padrão&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Unknown"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;     
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// Saída: Greeting&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👽 &lt;em&gt;A estrutura &lt;code&gt;when&lt;/code&gt; em Kotlin é semelhante ao &lt;code&gt;switch-case&lt;/code&gt; em JavaScript, por exemplo. :)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Usando o &lt;code&gt;when&lt;/code&gt; como expressão, atribuímos isso a uma variável. Veja só:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;check&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;

&lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;check&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Legal demais, né?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Se usamos o &lt;code&gt;when&lt;/code&gt; como uma expressão, o &lt;code&gt;else&lt;/code&gt; é obrigatório, a menos que o compilador possa detectar que todos os casos possíveis estão cobertos pelas condições implementadas.&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;when&lt;/code&gt; também é útil quando você precisa verificar uma cadeia de expressões booleanas, vamos dar uma olhada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;temp&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;

&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Se temp &amp;lt; 0 for true, description recebe "very cold"&lt;/span&gt;
    &lt;span class="n"&gt;temp&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"very cold"&lt;/span&gt;
    &lt;span class="c1"&gt;// Se temp &amp;lt; 10 for true, description recebe "a bit cold"&lt;/span&gt;
    &lt;span class="n"&gt;temp&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"a bit cold"&lt;/span&gt;
    &lt;span class="c1"&gt;// Se temp &amp;lt; 20 é true, description recebe "warm"&lt;/span&gt;
    &lt;span class="n"&gt;temp&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"warm"&lt;/span&gt;
    &lt;span class="c1"&gt;// description recebe "hot" caso não caia em nenhuma condição acima&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"hot"&lt;/span&gt;             
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// warm&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Ranges
&lt;/h2&gt;

&lt;p&gt;🔸 Em Kotlin, os &lt;code&gt;ranges&lt;/code&gt; são uma maneira de definir intervalos de valores. Eles são usados principalmente com tipos que podem ser comparados, como números e caracteres. &lt;/p&gt;

&lt;p&gt;Um range é definido usando o operador ".." (que é chamado de operador de range) e pode ser usado para criar intervalos fechados ou abertos. Vamos dar uma olhada em alguns exemplos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;closedRange&lt;/span&gt; &lt;span class="p"&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="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;closedRange&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// Isso imprimirá 1, 2, 3, 4, 5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uma coisa daora sobre &lt;code&gt;ranges&lt;/code&gt; é que você pode criar ranges de caracteres ou substrings de strings. Veja só:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;charRange&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="sc"&gt;'a'&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="sc"&gt;'z'&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;char&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;charRange&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;char&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// Isso imprimirá todas as letras minúsculas de 'a' a 'z'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora criando um range de &lt;em&gt;substrings&lt;/em&gt; a partir de uma string:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;str&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Hello, Kotlin"&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;substringRange&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;substringRange&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Isso imprimirá "Hello"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Loops
&lt;/h2&gt;

&lt;p&gt;🔸 No Kotlin, temos estruturas como o &lt;code&gt;while&lt;/code&gt;, que permite continuar uma ação até que uma determinada condição seja satisfeita, e o &lt;code&gt;for&lt;/code&gt;, que é utilizado para iterar um número específico de vezes, executando ações. &lt;/p&gt;

&lt;p&gt;Vamos explorar um pouco mais essas duas estruturas.&lt;/p&gt;

&lt;p&gt;Imagine que eu queria criar um looping que itera 5 vezes. Para isso poderia fazer um laço &lt;code&gt;for&lt;/code&gt;:&lt;/p&gt;

&lt;h3&gt;
  
  
  For
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="k"&gt;in&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="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// irá imprimir: 12345&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Eu posso querer percorrer uma lista que contém sabores de bolos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;cakes&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;listOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"chocolate"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"baunilha"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"milho"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cake&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;cakes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cake&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// Isso irá imprimir cada um dos sabores da lista `cakes`.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  While
&lt;/h3&gt;

&lt;p&gt;🔸 Como em outras linguagens podemos utilizar o &lt;code&gt;while&lt;/code&gt; de duas maneiras:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Para executar um bloco de código enquanto uma expressão condicional é verdadeira. &lt;code&gt;while&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Para executar o bloco de código primeiro e depois verificar a expressão condicional. &lt;code&gt;do-while&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;💠 &lt;strong&gt;No primeiro caso: &lt;code&gt;while&lt;/code&gt;:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="py"&gt;cakesEaten&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cakesEaten&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Comeu um bolo"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;cakesEaten&lt;/span&gt;&lt;span class="p"&gt;++&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Comer um bolo&lt;/span&gt;
&lt;span class="c1"&gt;// Comer um bolo&lt;/span&gt;
&lt;span class="c1"&gt;// Comer um bolo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;💠 &lt;strong&gt;No segundo caso: &lt;code&gt;do-while&lt;/code&gt;:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="py"&gt;cakesEaten&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="py"&gt;cakesBaked&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cakesEaten&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Comeu um bolo"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;cakesEaten&lt;/span&gt;&lt;span class="p"&gt;++&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"assou um bolo"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;cakesBaked&lt;/span&gt;&lt;span class="p"&gt;++&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cakesBaked&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;cakesEaten&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// Comer um bolo&lt;/span&gt;
&lt;span class="c1"&gt;// Comer um bolo&lt;/span&gt;
&lt;span class="c1"&gt;// Comer um bolo&lt;/span&gt;
&lt;span class="c1"&gt;// asse um bolo&lt;/span&gt;
&lt;span class="c1"&gt;// asse um bolo&lt;/span&gt;
&lt;span class="c1"&gt;// asse um bolo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No código acima, temos duas variáveis, &lt;code&gt;cakesEaten&lt;/code&gt; e &lt;code&gt;cakesBaked&lt;/code&gt;, que estão sendo usadas para controlar o número de bolos consumidos e assados. Bora ver o que está acontecendo passo a passo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Inicialmente, ambas as variáveis cakesEaten e cakesBaked estão definidas como 0.&lt;/li&gt;
&lt;li&gt;Em seguida, há um loop while que continua até que o valor de cakesEaten seja menor que 3. Dentro desse loop, a mensagem "Eat a cake" é impressa na tela usando println, e então o valor de cakesEaten é incrementado em 1.&lt;/li&gt;
&lt;li&gt;O loop while continuará a ser executado até que cakesEaten seja igual ou maior que 3. Isso significa que o loop será executado três vezes, resultando na impressão de "Comer um bolo" três vezes e no incremento de cakesEaten para 3.&lt;/li&gt;
&lt;li&gt;Após a saída do primeiro loop, há um segundo loop do-while. Este loop imprime a mensagem "Asse um bolo" na tela usando println, e então o valor de cakesBaked é incrementado em 1.&lt;/li&gt;
&lt;li&gt;O loop do-while continuará a ser executado até que o valor de cakesBaked seja menor do que o valor de cakesEaten. Isso significa que o loop será executado três vezes, uma vez que cakesBaked é inicializado como 0 e cakesEaten é igual a 3 após a conclusão do primeiro loop. Portanto, o loop imprime "Asse um bolo" três vezes e incrementa cakesBaked para 3.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;🧠 &lt;a href="https://kotlinlang.org/docs/kotlin-tour-control-flow.html#practice" rel="noopener noreferrer"&gt;Agora faça os exercícios para praticar o que aprendemos até aqui&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a id="funcoes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Funções
&lt;/h2&gt;

&lt;p&gt;Usamos a palavra reservada &lt;code&gt;fun&lt;/code&gt; para declarar uma função. &lt;em&gt;&lt;del&gt;Divertido, né?🤪&lt;/del&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello, world!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="c1"&gt;// Hello, world!&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fizemos algo parecido &lt;del&gt;igual&lt;/del&gt; no início desse conteúdo, lembra?! 😅&lt;/p&gt;

&lt;p&gt;Em Kotlin: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;os parâmetros da função são escritos entre parênteses &lt;code&gt;()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;cada parâmetro deve ter um tipo e vários parâmetros devem ser separados por vírgulas &lt;code&gt;,&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;o tipo de retorno é escrito após os parênteses da função &lt;code&gt;()&lt;/code&gt;, separados por dois pontos &lt;code&gt;:&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;o corpo de uma função é escrito entre chaves &lt;code&gt;{}&lt;/code&gt;.&lt;del&gt;(Igual no JavaScript rs)&lt;/del&gt;
&lt;/li&gt;
&lt;li&gt;O &lt;code&gt;return&lt;/code&gt; é usado para sair ou retornar algo de uma função. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Veja um exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="c1"&gt;// 3&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;A primeira função é chamada &lt;code&gt;sum&lt;/code&gt; e recebe dois parâmetros inteiros (x e y) e retorna um valor inteiro. O que essa função faz é simples: ela pega os valores de x e y, soma, em seguida, retorna o resultado da soma.&lt;/li&gt;
&lt;li&gt;A segunda função é chamada &lt;code&gt;main&lt;/code&gt;. Ela é a função de entrada do programa e é onde a execução começa. Dentro da função &lt;code&gt;main&lt;/code&gt;, nós chamamos a função &lt;code&gt;sum(1, 2)&lt;/code&gt;, que calcula a soma de 1 e 2 (resultando em 3) e, em seguida, usamos a função "println" para imprimir o resultado.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Nomeando argumentos
&lt;/h3&gt;

&lt;p&gt;Incluir nomes de parâmetros torna seu código mais fácil de ler. Se você incluir nomes de parâmetros, poderá escrevê-los em qualquer ordem.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;printMessageWithPrefix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[$prefix] $message"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Uses named arguments with swapped parameter order&lt;/span&gt;
    &lt;span class="nf"&gt;printMessageWithPrefix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prefix&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Log"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Hello"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;// Isso imprime: [Log] Hello&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Valores de parâmetro padrão﻿
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;printMessageWithPrefix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Info"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[$prefix] $message"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Caso nenhum valor seja passado para o parâmetro &lt;code&gt;prefix&lt;/code&gt;, o valor padrão será "Info".&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="nf"&gt;printMessageWithPrefix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Log"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
    &lt;span class="c1"&gt;// [Log] Hello&lt;/span&gt;


    &lt;span class="nf"&gt;printMessageWithPrefix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;        
    &lt;span class="c1"&gt;// [Info] Hello&lt;/span&gt;

    &lt;span class="nf"&gt;printMessageWithPrefix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prefix&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Log"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Hello"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;// [Log] Hello&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;👀 Você pode pular parâmetros específicos com valores padrão, em vez de omiti-los. No entanto, após pular o primeiro parâmetro, você deve nomear todos os parâmetros subsequentes. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Função sem retorno
&lt;/h3&gt;

&lt;p&gt;💠 Se sua função não retorna um valor útil, o tipo de retorno dela é &lt;code&gt;Unit&lt;/code&gt;. &lt;code&gt;Unit&lt;/code&gt; é um tipo com apenas um valor - Unit.&lt;/p&gt;

&lt;p&gt;Você não precisa declarar explicitamente que a função retorna &lt;code&gt;Unit&lt;/code&gt; em seu corpo de função. Isso significa que você não precisa usar a palavra-chave &lt;code&gt;return&lt;/code&gt; ou declarar um tipo de retorno, vamos ver alguns exemplos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;printMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;// `return Unit` ou `return` é opcional&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;printMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;// Hello&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Funções &lt;code&gt;single-expression&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;🔸 Para tornar nosso código mais conciso, podemos usar funções de "única expressão". Por exemplo, podemos encurtar a nossa  função sum() desse jeito aqui:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="c1"&gt;// antes:&lt;/span&gt;

&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// depois:&lt;/span&gt;

&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você pode remover as chaves &lt;code&gt;{}&lt;/code&gt; e declarar o corpo da função usando o operador de atribuição &lt;code&gt;=&lt;/code&gt;. E devido à inferência de tipos do Kotlin, você também pode omitir o tipo de retorno. A função sum() se torna então uma única linha 😱&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👀 Omissão do tipo de retorno é apenas possível quando sua função não possui corpo &lt;code&gt;({})&lt;/code&gt;, a menos que o tipo de retorno de sua função seja &lt;code&gt;Unit&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;🧠 &lt;a href="https://kotlinlang.org/docs/kotlin-tour-functions.html#functions-practice" rel="noopener noreferrer"&gt;Agora faça os exercícios para praticar o que aprendemos até aqui&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  💎 Bônus
&lt;/h2&gt;

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

&lt;p&gt;Nessa parte bônus, irei explicar como fazer o download do IntelliJ IDEA gratuitamente e como aproveitar ao máximo essa ferramenta para aprimorar seus conhecimentos em Kotlin, através de prática direta na própria IDE 😻&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👁️ Antes de instalar o IntelliJ IDEA, tenha certeza que o JDK está instalado na sua máquina. Você pode baixar o JDK mais recente diretamente do site da Oracle ou optar por uma distribuição OpenJDK, que é uma alternativa de código aberto. Certifique-se de fazer todas as configurações necessárias.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Baixe o IntelliJ aqui nesse &lt;a href="https://www.jetbrains.com/idea/download/?section=mac" rel="noopener noreferrer"&gt;link&lt;/a&gt;. &lt;strong&gt;Informação importante: A primeira opção que aparece é a Ultimate, não é essa que queremos de um scroll para baixo e faça o download da &lt;code&gt;Community Edition&lt;/code&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Depois de baixar, siga todos os procedimentos de acordo com seu sistema operacional.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quando você abrir o IntelliJ IDEA, provavelmente você terá algo parecido com isso daqui:&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%2Fjecbnv188yxo8eo005qn.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%2Fjecbnv188yxo8eo005qn.png" alt="Print da IDE IntelliJ mostrando a página inicial da IDE" width="800" height="631"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se quisermos criar um novo projeto Kotlin, podemos clicar em &lt;code&gt;new project&lt;/code&gt; e aqui não tem muito segredo, você deve escolher um nome para seu projeto e colocar a linguagem desejada, que no nosso caso é o &lt;code&gt;Kotlin&lt;/code&gt; e logo após clicar em &lt;code&gt;create&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Usando a IDE para aprender/praticar Kotlin 🤯
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Na tela inicial, à esquerda, clique em "Learn".&lt;/li&gt;
&lt;li&gt;Em seguida, localize e clique em "New Course" no lado direito.&lt;/li&gt;
&lt;li&gt;Após clicar em "New Course", uma nova página será aberta. No lado esquerdo, clique em "Marketplace". Neste caso, estou fazendo o seguinte curso.&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%2Fcdthbfdmtm74mdy2xnum.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%2Fcdthbfdmtm74mdy2xnum.png" alt="print da IDE IntelliJ mostrando a parte de cursos e desafios, circulando o curso kotlin Koans, demonstrando qual curso eu selecionei" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Depois de escolher, clique em &lt;code&gt;Open&lt;/code&gt; e isso o levará para uma página que inclui uma série de desafios, veja só:&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%2Fmnb18q5cv7y8van6pjs0.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%2Fmnb18q5cv7y8van6pjs0.png" alt="print da tela de courses da IDE IntelliJ" width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;À esquerda, você encontrará uma lista de todos os desafios propostos.&lt;/li&gt;
&lt;li&gt;No centro é onde você irá resolver esses desafios, ou seja, onde você irá codar.&lt;/li&gt;
&lt;li&gt;À direita, você encontrará a descrição do desafio, ou seja, as instruções sobre o que precisa ser feito.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Depois que finalizar o desafio para verificar se está correto e prosseguir para o próximo, basta clicar em &lt;code&gt;check&lt;/code&gt;.&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%2Fifjik55c65lk4cdwbby3.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%2Fifjik55c65lk4cdwbby3.png" alt="print da tela de courses da IDE IntelliJ" width="800" height="259"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Chegamos ao fim desta primeira parte, espero que tenham gostado!&lt;/p&gt;

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

&lt;p&gt;&lt;del&gt;Se você leu até o final reage com um 💟 se não, não precisa reagir :(.&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/analaura" rel="noopener noreferrer"&gt;&lt;br&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%2Fq5lmes6jh7hxyeqiuvd0.jpg" alt="Imagem com a logo da plataforma Buy Me a Coffee" width="170" height="37"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>kotlin</category>
      <category>android</category>
    </item>
    <item>
      <title>[off-topic] Top 5 Playlists Que Eu Escuto Enquanto Estou Programando</title>
      <dc:creator>Ana Laura</dc:creator>
      <pubDate>Sun, 15 Oct 2023 23:11:37 +0000</pubDate>
      <link>https://dev.to/analaura/off-topic-top-5-playlists-que-eu-escuto-enquanto-programo-537e</link>
      <guid>https://dev.to/analaura/off-topic-top-5-playlists-que-eu-escuto-enquanto-programo-537e</guid>
      <description>&lt;p&gt;Hoje vou trazer algo meio aleatório aqui 😅 mas é que eu curto muito codar escutando música &lt;em&gt;&lt;del&gt;(e fazer tudo também)&lt;/del&gt;&lt;/em&gt;. Então, pensei: por que não criar um post no dev.to para compartilhar as playlists que costumo ouvir enquanto estou programando ou até mesmo criando conteúdo. &lt;/p&gt;

&lt;p&gt;Eu vou indicar músicas rap/trap que geralmente é estilo de música que eu mais escuto. &lt;/p&gt;

&lt;p&gt;Vou fazer um top 5 aqui 💟&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://open.spotify.com/intl-pt/artist/6rk6Izp6o42fUdE0jRqAP4?si=XicjNFFITbCevyN55jybTA" rel="noopener noreferrer"&gt;Alee&lt;/a&gt; Esse artista maravilhoso que na verdade não é nem o álbum, geralmente dou play em todas, descobri ele faz pouco tempo.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://open.spotify.com/intl-pt/album/4GWoodiAMapPzgitxYvygx?si=3C6Z5ekFQoiKvIUTs9fOfg" rel="noopener noreferrer"&gt;Flora matos - Do Lado De Flora&lt;/a&gt; A verdade é que a Flora se encaixa em todos os momentos da sua vida, mas esse álbum "DO LADO DE FLORA", é perfeito pra codar!&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://open.spotify.com/intl-pt/album/062ycDqIDtT21UFyKlHDvO?si=oG6L3IfzSb2GPjSgP9t5VQ" rel="noopener noreferrer"&gt;Tasha e Tracie - Diretoria&lt;/a&gt; Maravilhosas, se você quer se sentir incrível e determinado a resolver TODO e QUALQUER bug, escute Tasha e Tracie.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://open.spotify.com/intl-pt/album/04zQ2qk2AsRPZppeI6TvWl?si=s951N5UCQDe-BHZi_n0K3A" rel="noopener noreferrer"&gt;Nill - Regina&lt;/a&gt; Ai esse álbum, tenho poucas palavras pra ele pois amo demais!&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://open.spotify.com/playlist/1g4Bekw7Xnq2AV7Md9XFZE?si=559e07af66f84d23" rel="noopener noreferrer"&gt;Boombap&lt;/a&gt; Essa playlist de Boombap simplesmente perfeita, eu ultimamente to viciada nela escutando 39393x por dia!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Tudo que eu recomendei aqui tem o selo Ana Laura de qualidade, faça bom proveito!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;bjs!&lt;/code&gt;&lt;/p&gt;

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

</description>
      <category>playlist</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Como Habilitar o Botão de Envio apenas com Inputs Preenchidos Usando JavaScript</title>
      <dc:creator>Ana Laura</dc:creator>
      <pubDate>Wed, 04 Oct 2023 18:38:22 +0000</pubDate>
      <link>https://dev.to/analaura/como-habilitar-o-botao-de-envio-apenas-com-inputs-preenchidos-usando-javascript-1djh</link>
      <guid>https://dev.to/analaura/como-habilitar-o-botao-de-envio-apenas-com-inputs-preenchidos-usando-javascript-1djh</guid>
      <description>&lt;p&gt;Oi pessoal! 💟&lt;/p&gt;

&lt;p&gt;Estes dias, peguei um &lt;em&gt;freela&lt;/em&gt; no qual o cliente tinha alguns formulários em seu site e queria captar leads de forma mais concisa. Para isso, ele precisava que a pessoa só pudesse clicar no botão de enviar o formulário quando todos os inputs da página estivessem preenchidos. &lt;/p&gt;

&lt;p&gt;O site era feito em WordPress e os formulários criados na RD Station eram integrados ao site no WordPress via script.&lt;/p&gt;

&lt;p&gt;Para resolver esse problema, optei por usar JavaScript, já que os formulários da RD Station não nos oferecem essa opção na hora de editar o formulário, tive que fazer isso de forma "manual". No WordPress, conseguimos adicionar blocos de código no final da tag &lt;code&gt;body&lt;/code&gt; do site quando usamos o editor Elementor (confesso que não sei dizer quanto a outros editores, mas deve haver algum plugin que faça isso), o que facilita minha vida em 100% na hora de fazer esse tipo de coisa.&lt;/p&gt;

&lt;p&gt;Vamos criar um cenário aqui para facilitar o entendimento do que eu fiz. O formulário é um HTML, então vamos imaginar algo assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
&amp;lt;h2&amp;gt;Preencha o formulário&amp;lt;/h2&amp;gt;

&amp;lt;form action="#" method="post"&amp;gt;
  &amp;lt;label for="name"&amp;gt;Nome:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;
  &amp;lt;input type="text" id="name" name="name"&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

  &amp;lt;label for="email"&amp;gt;E-mail:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;
  &amp;lt;input type="email" id="email" name="email"&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

  &amp;lt;label for="phone"&amp;gt;Telefone:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;
  &amp;lt;input type="tel" id="phone" name="phone"&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

  &amp;lt;button type="submit" id="button"&amp;gt;Enviar formulário&amp;lt;/button
&amp;lt;/form&amp;gt;

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

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;👀 Aqui serei mais direta, mas é super importante lembrarmos de quebrar o problema em partes, pois assim fica mais fácil de resolvermos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Implementando a lógica 🔍
&lt;/h2&gt;

&lt;p&gt;A primeira coisa que podemos fazer aqui é capturar nosso botão e desabilitá-lo, além de alterar o estilo, deixando-o com uma opacidade menor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;button&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;opacity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.7&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;disabled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois, preciso selecionar os inputs. Há uma forma mais simples de pegar todos pela tag, por exemplo, usando o &lt;code&gt;getElementsByTagName&lt;/code&gt;, mas no meu caso, ele estava retornando inputs de toda a página. Então, minha saída foi fazer isso aqui. Como eram apenas 3 inputs, selecionei cada um pelo ID e criei um array de inputs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;textField&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;emailField&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;phoneField&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;phone&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;formFields&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;textField&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;emailField&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;phoneField&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Agora, vamos criar a função que vai fazer o trem começar a funcionar, &lt;em&gt;como a gente diria na minha terra, MG!&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;checkFormFields&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;fieldsFilled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;formFields&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;field&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;field&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;fieldsFilled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Primeiro, criamos a variável &lt;code&gt;fieldsFilled&lt;/code&gt;. Essa variável é a responsável por controlar se o &lt;code&gt;input&lt;/code&gt; está preenchido ou não. Depois, percorremos nossa lista de inputs fazendo uma verificação: quando o meu &lt;code&gt;input&lt;/code&gt; estiver vazio, a minha variável &lt;code&gt;fieldsFilled&lt;/code&gt;deverá ser &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Agora, precisamos desabilitar e habilitar o nosso botão, dependendo da situação do nosso &lt;code&gt;input&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;checkFormFields&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;fieldsFilled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;formFields&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;field&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;field&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;fieldsFilled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fieldsFilled&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;removeAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;disabled&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;opacity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cursor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pointer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;disabled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Veja bem, agora adicionamos uma condição na nossa função: quando a minha variável &lt;code&gt;fieldsFilled&lt;/code&gt; for &lt;code&gt;true&lt;/code&gt;, o que significa que meu &lt;code&gt;input&lt;/code&gt; foi preenchido, ele remove o atributo &lt;code&gt;disabled&lt;/code&gt;, volta o meu &lt;code&gt;button&lt;/code&gt; para a opacidade normal dele e muda também o cursor do mouse. Senão, o botão permanece desabilitado até que todos os inputs sejam preenchidos.&lt;/p&gt;

&lt;p&gt;Ana, acabou? Não!!&lt;/p&gt;

&lt;p&gt;Agora, para finalizar, precisamos disparar esse evento nos nossos inputs, fora da função:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;formFields&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;field&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;field&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;input&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;checkFormFields&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Feito! Temos um botão desabilitado que será habilitado somente quando todos os campos forem preenchidos&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>tutorial</category>
      <category>braziliandevs</category>
    </item>
  </channel>
</rss>
