Java 8 – Ejemplos de Stream.map ()

    Introducci贸n

    Una secuencia es una secuencia de objetos que admite muchos m茅todos diferentes que se pueden combinar para producir el resultado deseado.

    Se pueden crear a partir de numerosas fuentes de datos, que suelen ser colecciones, pero tambi茅n pueden ser canales de E / S, Arrays, tipos de datos primitivos, etc.

    Es importante enfatizar que una corriente no es una estructura de datos, ya que no almacena ning煤n dato. Es solo un contenedor de fuente de datos que nos permite operar con datos m谩s r谩pido, m谩s f谩cil y con un c贸digo m谩s limpio.

    Una secuencia tampoco modifica nunca la estructura de datos original, solo devuelve el resultado de los m茅todos canalizados.

    Tipos de corrientes

    Las transmisiones pueden ser secuenciales (creadas con stream()), o paralelo (creado con parallelStream()). Las transmisiones paralelas pueden operar en m煤ltiples subprocesos, mientras que las secuencias secuenciales no.

    Las operaciones en los arroyos pueden ser intermedias o terminales:

    Intermedio las operaciones en las corrientes devuelven una corriente. Es por eso que podemos encadenar m煤ltiples operaciones intermedias sin usar punto y coma. Las operaciones intermedias incluyen los siguientes m茅todos:

    • map(op) – Devuelve una nueva secuencia en la que se proporciona op La funci贸n se aplica a cada uno de los elementos del flujo original.
    • filter(cond) – Devuelve una nueva secuencia que solo contiene los elementos de la secuencia original que cumplen la condici贸n cond, especificado por un predicado
    • sorted() – Devuelve la secuencia original, pero con los elementos ordenados

    Terminal las operaciones son nulas o devuelven un resultado que no es de flujo. Se llaman terminales porque no podemos encadenar m谩s operaciones de transmisi贸n una vez que hemos usado una terminal, sin crear una nueva transmisi贸n a partir de ella y comenzar de nuevo.

    Algunas de las operaciones de la terminal son:

    • collect() – Devuelve el resultado de las operaciones intermedias realizadas en la secuencia original.
    • forEach() – Un m茅todo vac铆o que se utiliza para recorrer la secuencia.
    • reduce() – Devuelve un 煤nico resultado producido a partir de una secuencia completa de elementos en la secuencia original.

    En este tutorial, repasaremos map() operaci贸n y c贸mo podemos usarlo con Streams para convertir / mapear objetos de varios tipos.

    Ejemplos de Stream.map ()

    Echemos un vistazo a un par de ejemplos y veamos qu茅 podemos hacer con el map() operaci贸n.

    Flujo de enteros a flujo de cadenas

    Arrays.asList(1, 2, 3, 4).stream()
            .map(n -> "Number " + String.valueOf(n))
            .forEach(n -> System.out.println(n + " as a " + n.getClass().getName()));
    

    Aqu铆, hicimos una lista de enteros y llamamos stream() en la lista para crear un nuevo flujo de datos. Luego, mapeamos cada n煤mero n en la lista, a trav茅s del map() m茅todo, a una cadena. Las Strings simplemente consisten en "Number" y el String.valueOf(n).

    Entonces, para cada n煤mero en nuestra lista original, ahora tendremos un "Number n" Cadena que le corresponde.

    Ya que map() devuelve un Stream de nuevo, hemos utilizado el forEach() m茅todo para imprimir cada elemento en 茅l.

    Ejecutar este c贸digo da como resultado:

    Number 1 as a java.lang.String
    Number 2 as a java.lang.String
    Number 3 as a java.lang.String
    Number 4 as a java.lang.String
    

    Nota: Esto no ha alterado la lista original en lo m谩s m铆nimo. Simplemente procesamos los datos e imprimimos los resultados. Si quisi茅ramos persistir en este cambio, har铆amos collect() los datos de nuevo en un Collection objeto como un List, Map, Set, etc:

    List<Integer> list = Arrays.asList(1, 2, 3, 4);
    		
    List<String> mappedList = list.stream()
            .map(n -> "Number " + String.valueOf(n))
            .collect(Collectors.toList());
    
    System.out.println(list);
    System.out.println(mappedList);
    

    Esto resulta en:

    [1, 2, 3, 4]
    [Number 1, Number 2, Number 3, Number 4]
    

    Flujo de cadenas en flujo de enteros

    Ahora, hag谩moslo al rev茅s: convierta un flujo de cadenas en un flujo de enteros:

    Arrays.asList("1", "2", "3", "4").stream()
            .map(n -> Integer.parseInt(n))
            .forEach(n -> System.out.println(n));
    

    Como se esperaba, este c贸digo producir谩 el siguiente resultado:

    1
    2
    3
    4
    

    Lista de objetos en la lista de otros objetos

    Digamos que tenemos una clase Point que representa un punto en un sistema de coordenadas cartesiano:

    public class Point {
        int X;
        int Y;
        
        Point(int x, int y){
            this.X=x;
            this.Y=y;
        }
        
        @Override
        public String toString() {
            return "(" + this.X + ", " + this.Y + ")";
        }
        
    }
    

    Entonces, digamos que queremos escalar una forma determinada por un factor de 2, esto significa que tenemos que tomar todos los puntos que tenemos y duplicar sus X y Y valores. Esto se puede hacer mapeando los valores originales con sus contrapartes escaladas.

    Luego, dado que nos gustar铆a usar las nuevas coordenadas, recopilaremos estos datos en una nueva lista de puntos escalados:

    List<Point> originalPoints = Arrays.asList(new Point(1, 2),
                                               new Point(3, 4),
                                               new Point(5, 6),
                                               new Point(7, 8));
    System.out.println("Original vertices: " + originalPoints);
        
    List<Point> scaledPoints = originalPoints
            .stream()
            .map(n -> new Point(n.X * 2, n.Y * 2))
            .collect(Collectors.toList());
    
    System.out.println("Scaled vertices: " + scaledPoints);
    

    Este ejemplo producir谩 el siguiente resultado:

    Original vertices: [(1, 2), (3, 4), (5, 6), (7, 8)]
    Scaled vertices: [(2, 4), (6, 8), (10, 12), (14, 16)]
    

    Conclusi贸n

    En este art铆culo, explicamos qu茅 transmisiones hay en Java. Mencionamos algunos de los m茅todos b谩sicos utilizados en las transmisiones y nos centramos espec铆ficamente en la map() m茅todo y c贸mo se puede utilizar para la manipulaci贸n de flujos.

    Es importante mencionar que los streams no son realmente una parte obligatoria de la programaci贸n, sin embargo, son m谩s expresivos y pueden mejorar significativamente la legibilidad de su c贸digo, raz贸n por la cual se convirtieron en una pr谩ctica de programaci贸n com煤n.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *