{"id":237,"date":"2023-07-08T01:54:29","date_gmt":"2023-07-08T01:54:29","guid":{"rendered":"https:\/\/canessaalvamiguel.dev\/?p=237"},"modified":"2023-07-08T01:58:17","modified_gmt":"2023-07-08T01:58:17","slug":"flatmap-in-scala","status":"publish","type":"post","link":"https:\/\/canessaalvamiguel.dev\/index.php\/2023\/07\/08\/flatmap-in-scala\/","title":{"rendered":"flatMap in Scala"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Introducci\u00f3n: <\/h2>\n\n\n\n<p>En el desarrollo de software en Scala, una de las caracter\u00edsticas m\u00e1s poderosas es la capacidad de componer transformaciones de datos de manera concisa y elegante. Una de las herramientas clave para lograr esto es el m\u00e9todo <code>flatMap<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfQu\u00e9 es flatMap en Scala?<\/h2>\n\n\n\n<p><code>flatMap<\/code> es un m\u00e9todo de orden superior que se utiliza para realizar transformaciones en estructuras de datos que tambi\u00e9n contienen un contexto, como <code>Option<\/code>, <code>List<\/code> y <code>Future<\/code>. Toma una funci\u00f3n como argumento que toma el valor actual y devuelve un nuevo contenedor del mismo tipo. La diferencia clave entre <code>map<\/code> y <code>flatMap<\/code> es que <code>flatMap<\/code> &#8220;aplana&#8221; el resultado, es decir, si el resultado de la funci\u00f3n es una estructura anidada, se extrae el valor interno.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ejemplos de uso de flatMap:<\/h2>\n\n\n\n<p><strong>Trabajando con Option:<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: scala; title: ; notranslate\" title=\"\">\nval maybeString: Option&#x5B;String] = Some(&quot;Hola&quot;)\nval resultado: Option&#x5B;String] = maybeString.flatMap(str =&gt; Some(str.toUpperCase))\nprintln(resultado) \/\/ Output: Some(&quot;HOLA&quot;)\n<\/pre><\/div>\n\n\n<p>En este ejemplo, utilizamos <code>flatMap<\/code> en un <code>Option<\/code> para transformar el valor contenido en may\u00fasculas. La funci\u00f3n de <code>flatMap<\/code> toma el valor actual y devuelve un nuevo <code>Option<\/code> que contiene el valor transformado.<\/p>\n\n\n\n<p><strong>Componiendo transformaciones en una lista:<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: scala; title: ; notranslate\" title=\"\">\nval listaNumeros: List&#x5B;Int] = List(1, 2, 3, 4, 5)\nval resultado: List&#x5B;Int] = listaNumeros.flatMap(num =&gt; List(num, num * 2))\nprintln(resultado) \/\/ Output: List(1, 2, 2, 4, 3, 6, 4, 8, 5, 10)\n<\/pre><\/div>\n\n\n<p>En este caso, utilizamos <code>flatMap<\/code> en una lista para generar una nueva lista que contiene tanto el n\u00famero original como el n\u00famero multiplicado por 2 para cada elemento de la lista original. La funci\u00f3n de <code>flatMap<\/code> toma cada n\u00famero de la lista original y devuelve una nueva lista con los dos valores.<\/p>\n\n\n\n<p><strong>Encadenando transformaciones con Option y List<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: scala; title: ; notranslate\" title=\"\">\nval maybeNumero: Option&#x5B;Int] = Some(5)\nval resultado: Option&#x5B;List&#x5B;Int]] = maybeNumero.flatMap(num =&gt; Some(List(num, num * 2, num * 3)))\nprintln(resultado) \/\/ Output: Some(List(5, 10, 15))\n<\/pre><\/div>\n\n\n<p>En este ejemplo, utilizamos <code>flatMap<\/code> en un <code>Option<\/code> para transformar un n\u00famero en una lista de valores calculados a partir de ese n\u00famero. La funci\u00f3n de <code>flatMap<\/code> toma el n\u00famero y devuelve un nuevo <code>Option<\/code> que contiene la lista resultante.<\/p>\n\n\n\n<p><strong>Eliminando valores None de una lista<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: scala; title: ; notranslate\" title=\"\">\nval listaOpcionales: List&#x5B;Option&#x5B;Int]] = List(\n    Some(1), None, Some(2), None, Some(3)\n)\n\nval listaSinNones: List&#x5B;Int] = listaOpcionales.flatMap( x =&gt; x )\n\nprintln(listaSinNones) \/\/ Output: List(1, 2, 3)\n<\/pre><\/div>\n\n\n<p><strong>Duplicando los valores de una lista<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: scala; title: ; notranslate\" title=\"\">\nval listaOpcionales: List&#x5B;Option&#x5B;Int]] = List(\n    Some(1), None, Some(2), None, Some(3)\n)\n\nval dobleValorlistaSinNones: List&#x5B;Int] =listaOpcionales.flatMap {\n  case Some(valor) =&gt; Some(valor * 2)\n  case None =&gt; None\n}\n\nprintln(dobleValorlistaSinNones)\/\/ Output: List(2, 3, 6)\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\">Conclusiones:<\/h2>\n\n\n\n<p>El uso de <code>flatMap<\/code> en Scala nos permite componer transformaciones de manera concisa y eficiente. Al aprovechar <code>flatMap<\/code>, podemos evitar anidar estructuras de datos y encadenar operaciones de manera legible y expresiva. Esto mejora la claridad y mantenibilidad del c\u00f3digo, ya que podemos definir transformaciones paso a paso y evitar la creaci\u00f3n de estructuras temporales innecesarias.<\/p>\n\n\n\n<p>El m\u00e9todo <code>flatMap<\/code> es especialmente \u00fatil cuando trabajamos con estructuras de datos que contienen un contexto, como <code>Option<\/code> y <code>List<\/code>, pero tambi\u00e9n se puede utilizar con otros tipos que admiten la operaci\u00f3n <code>flatMap<\/code>. Al utilizar <code>flatMap<\/code> de manera efectiva, podemos crear flujos de trabajo complejos de manera m\u00e1s sencilla y expresiva, aprovechando la potencia del paradigma funcional en Scala.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introducci\u00f3n: En el desarrollo de software en Scala, una de las caracter\u00edsticas m\u00e1s poderosas es la capacidad de<\/p>\n","protected":false},"author":1,"featured_media":60,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[52,8],"class_list":["post-237","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-scala","tag-flatmap","tag-scala"],"_links":{"self":[{"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/posts\/237","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/comments?post=237"}],"version-history":[{"count":4,"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/posts\/237\/revisions"}],"predecessor-version":[{"id":241,"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/posts\/237\/revisions\/241"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/media\/60"}],"wp:attachment":[{"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/media?parent=237"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/categories?post=237"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/tags?post=237"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}