Introducci贸n
Contenido
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 proporcionaop
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贸ncond
, especificado por un predicadosorted()
– 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.