{"id":363,"date":"2021-09-21T16:51:55","date_gmt":"2021-09-21T15:51:55","guid":{"rendered":"http:\/\/justmakeit.es\/?p=363"},"modified":"2021-09-21T16:51:55","modified_gmt":"2021-09-21T15:51:55","slug":"java-8-map-filter-y-collect","status":"publish","type":"post","link":"http:\/\/justmakeit.es\/?p=363","title":{"rendered":"Java 8 Map, Filter, y Collect"},"content":{"rendered":"\n<p>Esto es una traducci\u00f3n del siguiente art\u00edculo para mi uso: https:\/\/dzone.com\/articles\/how-to-use-map-filter-collect-of-stream-in-java-8<\/p>\n\n\n<p>La funci\u00f3n <em>map<\/em>() es un m\u00e9todo de la clase <em>Stream<\/em> que representa el concepto de programaci\u00f3n funcional. Simplificando, el <em>map<\/em>() se usa para <strong>transformar un objeto en otro aplicando una funci\u00f3n<\/strong>.<br \/>Esta es la raz\u00f3n por la que <em>Stream.map<\/em>(Function mapper) tiene una <em>Function<\/em> como argumento. Por ejemplo, usando la <em>Function<\/em> <em>map<\/em>() puedes convertir una lista de <em>String<\/em> en una lista de <em>Integer<\/em> aplicando el m\u00e9todo <em>Integer.valueOf<\/em>() a cada <em>String<\/em> en la lista de entrada.<br \/>Todo lo que necesitas es una funci\u00f3n de mapeo para convertir un objeto en el otro. Entonces, la funci\u00f3n <em>map<\/em>() har\u00e1 la transformaci\u00f3n para t\u00ed. Es tambi\u00e9n una operaci\u00f3n <em>Stream intermedia<\/em>, lo que significa que puedes llamar a otros m\u00e9todos <em>Stream<\/em>, como <em>filter<\/em> o <em>collect<\/em> para crear una cadena de transformaciones.<br \/>El m\u00e9todo <em>filter<\/em>, como su nombre indica, filtra elementos bas\u00e1ndose en la condici\u00f3n que le das. Por ejemplo, si tu lista contiene n\u00fameros y s\u00f3lo quieres n\u00fameros pares, puedes usar el m\u00e9todo <em>filter<\/em> para seleccionar s\u00f3lo los n\u00fameros divisibles entre dos<br \/>El m\u00e9todo filter selecciona elementos bas\u00e1ndose en la condici\u00f3n que le proporcionas. Es por eso que <em>filter<\/em> acepta un <em>Predicate object<\/em>, que proporciona la funci\u00f3n que es aplicada a la condici\u00f3n. Si la la condici\u00f3n se cumple, el objeto es seleccionado. Si no se cumple ser\u00e1 ignorada<br \/>Igual que <em>map<\/em>, la operaci\u00f3n <em>filter<\/em> es una <em>operaci\u00f3n intermedia<\/em>, lo que significa que puedes llamar otros m\u00e9todos <em>Stream<\/em> tras llamar al <em>filter<\/em>. El m\u00e9todo <em>filter<\/em>() tambi\u00e9n es <em>lazy<\/em> (perezoso), lo que significa que no ser\u00e1 evaluado hasta que se realice una llamada a un m\u00e9todo <em>reduction<\/em>, como <em>collect<\/em>, y se detendr\u00e1 tan pronto como alcance su objetivo.<\/p>\n<h2>C\u00f3mo usar Map y Filter en Java 8<\/h2>\n<p><br \/>Se necesita un buen ejemplo para entender cualquier concepto nuevo. <em>String<\/em> e <em>Integer<\/em> son los tipos de dato m\u00e1s comunes en Java, he elegido un ejemplo que es simple e interesante.<br \/>Teniendo la lista de n\u00fameros definidos como <em>String<\/em> {\u00ab1\u00bb, \u00ab2\u00bb, \u00ab3\u00bb, \u00ab4\u00bb, \u00ab5\u00bb, \u00ab6\u00bb}. Quiero procesar la lista y conseguir otra lista de tipo <em>Integer<\/em> con los n\u00fameros.<br \/>Para conseguir los n\u00fameros, primero necesito convertir la <em>List<String><\/em> a <em>List<Integer><\/em>. Para hacerlo, puedo usar el m\u00e9todo <em>map<\/em>() de la clase <em>java.util.Stream<\/em>. Pero antes necesitamos un <em>Stream<\/em> como map() como se define en la clase java.util.stream.<br \/>Esto no es dif\u00edcil, puedes conseguir un stream a partir de cualquier <em>collection<\/em> (List, Set\u2026) llamando al m\u00e9todo <em>stream<\/em>(), que est\u00e1 definido en la interface <em>java.util.Collection<\/em><br \/>El m\u00e9todo <em>map(Function mapper)<\/em> toma una <em>Function<\/em>, t\u00e9cnicamente hablando, un objeto del tipo <em>java.util.Function<\/em>. Esta <em>Function<\/em> es aplicada a cada elemento del <em>Stream<\/em> para convertirlo en el tipo que queremos<br \/>Como necesitamos convertir un String a Integer, podemos pasar los m\u00e9todos <em>Integer.parseInt()<\/em> o <em>Integer.valueOf()<\/em> a la funci\u00f3n <em>map<\/em>().<br \/>Se elige el m\u00e9todo <em>valueOf<\/em>() por rendimiento y cach\u00e9.<\/p>\n\n\n<p>El <em>map<\/em>() devolver\u00e1 un <em>Stream <\/em>de <em>Integer <\/em>que contiene tanto los n\u00fameros pares e impares. Para seleccionar s\u00f3lo los pares podemos usar el m\u00e9todo <em>filter<\/em>().<br>Para eso usaremos un <em>object predicate<\/em> que es t\u00e9cnicamente una <em>Function <\/em>que convierte un objeto a <em>Boolean<\/em>. Pasamos un objeto y devuelve <em>true <\/em>o <em>false<\/em>. El <em>filter<\/em>, usa esa informaci\u00f3n para incluir el objeto en el <em>stream <\/em>resultado.<br>Para incluir s\u00f3lo los n\u00fameros pares llamamos a <em>filter(number -> number%2==0)<\/em>, lo que significa que cada n\u00famero ser\u00e1 dividido entre dos y si no hay resto, ser\u00e1 elegido.<br>Ya casi estamos. Pero, hasta aqu\u00ed s\u00f3lo tenemos el <em>Stream <\/em>de n\u00fameros pares, no la <em>List <\/em>de pares <em>Integer <\/em>que es lo que necesitamos.<br>Como necesitamos una <em>List <\/em>ejecutamos <em>collect(Collectors.toList())<\/em>, lo que acumula todos los n\u00fameros pares en una <em>List <\/em>y la devuelve.<br>C\u00f3mo sabe que tiene que devolver una <em>List<\/em>? Recuperamos esa informaci\u00f3n por <em>Type inference<\/em> (Inferencia de tipo), porque hemos definido la lista como <em>List<Integer><\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"http:\/\/justmakeit.es\/wp-content\/uploads\/2021\/09\/stream_performance_Java8_collection.png\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"342\" src=\"http:\/\/justmakeit.es\/wp-content\/uploads\/2021\/09\/stream_performance_Java8_collection.png\" alt=\"\" class=\"wp-image-365\" srcset=\"http:\/\/justmakeit.es\/wp-content\/uploads\/2021\/09\/stream_performance_Java8_collection.png 640w, http:\/\/justmakeit.es\/wp-content\/uploads\/2021\/09\/stream_performance_Java8_collection-300x160.png 300w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/a><\/figure>\n\n\n\n<p>Aqu\u00ed tenemos el c\u00f3digo Java que implementa lo que hemos explicado en la secci\u00f3n superior. Este c\u00f3digo es ejecutable<br>Puedes probar usando m\u00e1s <em>Functions map<\/em>() o m\u00e1s <em>filter<\/em>() para hacer la composici\u00f3n m\u00e1s larga y complicada. Puedes usar el m\u00e9todo <em>collect<\/em>() para recuperar el resultado en una <em>List<\/em>, <em>Set <\/em>o <em>Map <\/em>o cualquier otra <em>collection<\/em>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package tool;\n\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.stream.Collectors;\n\n\/**\n * \n * A simple Java Program to demonstrate how to use map and filter method Java 8.\n * In this program, we'll convert a list of String into a list of Integer and\n * then filter all even numbers.\n *\/\npublic class Hello {\n\n  public static void main(String[] args) {\n\n    List<String> numbers = Arrays.asList(\"1\", \"2\", \"3\", \"4\", \"5\", \"6\");\n    System.out.println(\"original list: \" + numbers);\n\n    List<Integer> even = numbers.stream()\n                                .map(s -> Integer.valueOf(s))\n                                .filter(number -> number % 2 == 0)\n                                .collect(Collectors.toList());\n\n    System.out.println(\"processed list, only even numbers: \" + even);\n\n  }\n\n}\n\nOutput\noriginal list: [1, 2, 3, 4, 5, 6]\nthe processed list, only even numbers: [2, 4, 6]<\/code><\/pre>\n\n\n\n<p>Se puede ver que la lista original contiene n\u00fameros desde 1 a 6 y que la lista filtrada s\u00f3lo contiene los n\u00fameros pares, 2, 4 y 6<br>La parte m\u00e1s importante del c\u00f3digo en este ejemplo es la compuesta por las cuatro l\u00edneas siguientes<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"http:\/\/justmakeit.es\/wp-content\/uploads\/2021\/09\/Java-8-Filter-Map-and-Collect-Example.png\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"277\" src=\"http:\/\/justmakeit.es\/wp-content\/uploads\/2021\/09\/Java-8-Filter-Map-and-Collect-Example.png\" alt=\"\" class=\"wp-image-366\" srcset=\"http:\/\/justmakeit.es\/wp-content\/uploads\/2021\/09\/Java-8-Filter-Map-and-Collect-Example.png 640w, http:\/\/justmakeit.es\/wp-content\/uploads\/2021\/09\/Java-8-Filter-Map-and-Collect-Example-300x130.png 300w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/a><\/figure>\n\n\n\n<p>El c\u00f3digo empieza con un <em>map<\/em>, despu\u00e9s un <em>filter <\/em>y finalmente un <em>collect<\/em>. Importa el orden? S\u00ed, importa.<br>Como nuestro filtro necesita de un valor int antes necesitamos convertir el Stream de String en un Stream de Integer. Por eso llamamos a la <em>Function map<\/em>() primero.<\/p>\n\n\n\n<p>Una vez que tenemos el <em>Stream <\/em>de <em>Integer<\/em>, podemos realizar la operaci\u00f3n que nos encuentra los n\u00fameros pares y pasar esa condici\u00f3n al <em>filter<\/em>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Esto es una traducci\u00f3n del siguiente art\u00edculo para mi uso: https:\/\/dzone.com\/articles\/how-to-use-map-filter-collect-of-stream-in-java-8 La funci\u00f3n map() es un m\u00e9todo de la clase &hellip; <a href=\"http:\/\/justmakeit.es\/?p=363\" class=\"btn btn-readmore\">Read More <span class=\"screen-reader-text\"> \u00abJava 8 Map, Filter, y Collect\u00bb<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[47,46,36,45,44],"class_list":["post-363","post","type-post","status-publish","format-standard","hentry","category-cosos","tag-collect","tag-filter","tag-java","tag-map","tag-stream"],"_links":{"self":[{"href":"http:\/\/justmakeit.es\/index.php?rest_route=\/wp\/v2\/posts\/363","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/justmakeit.es\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/justmakeit.es\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/justmakeit.es\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/justmakeit.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=363"}],"version-history":[{"count":2,"href":"http:\/\/justmakeit.es\/index.php?rest_route=\/wp\/v2\/posts\/363\/revisions"}],"predecessor-version":[{"id":367,"href":"http:\/\/justmakeit.es\/index.php?rest_route=\/wp\/v2\/posts\/363\/revisions\/367"}],"wp:attachment":[{"href":"http:\/\/justmakeit.es\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=363"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/justmakeit.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=363"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/justmakeit.es\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=363"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}