Java >> Tutorial de Java >  >> Java

Diferencia entre colecciones y flujos en Java

Collections y Streams, ambos son conceptualmente dos cosas diferentes que se utilizan para dos propósitos diferentes. Si las colecciones se utilizan para almacenar los datos, los flujos se utilizan para realizar operaciones en esos datos. En este artículo, discutiremos la diferencia entre colecciones y flujos en Java.

Colecciones y flujos en Java:

1) Diferencia conceptual

Las colecciones se utilizan para almacenar y agrupar los datos en una estructura de datos particular como Lista , Establecer o Mapa . Sin embargo, los flujos se utilizan para realizar operaciones complejas de procesamiento de datos como filtrado , coincidencia , mapeo etc. en datos almacenados como arreglos, colecciones o recursos de E/S. Eso significa que las colecciones son principalmente sobre datos y las secuencias son principalmente sobre operaciones en datos.

//Usage of collections
		
//Collections are mainly used to store the data
		
//Here, names are stored as List
		
List<String> names = new ArrayList<>();
		
names.add("Charlie");
		
names.add("Douglas");
		
names.add("Sundaraman");
		
names.add("Charlie");
		
names.add("Yuki");
		
//Usage of streams
		
//Streams are mainly used to perform operations on data
		
//like selecting only unique names
		
names.stream().distinct().forEach(System.out::println);
		
//Output :
		
//Charlie
//Douglas
//Sundaraman
//Yuki

2) Modificación de datos

Puede agregar o quitar elementos de las colecciones. Pero no puede agregar o eliminar elementos de las secuencias. Stream consume una fuente, realiza operaciones en ella y devuelve un resultado. No modifican ni siquiera la fuente.

List<String> names = Arrays.asList("Charlie", "Douglas", "Jacob");
		
//Adding elements to names
		
names.add("Sundaraman");
		
names.add("Yuki");
		
//Removing elements from names
		
names.remove(2);
		
//getting stream of unique names
		
Stream<String> uniqueNames = names.stream().distinct();
		
//You can't add or remove elements from stream
		
//There are no such methods in Stream

3) Iteración externa versus iteración interna

La especialidad principal de Java 8 Streams es que no necesita preocuparse por la iteración mientras usa flujos. Las secuencias realizan la iteración internamente detrás de escena por usted. Solo tiene que mencionar las operaciones a realizar sobre una fuente.

Por otro lado, debe hacer la iteración externamente sobre colecciones usando bucles.

List<String> names = new ArrayList<>();
				
names.add("Charlie");
				
names.add("Douglas");
				
names.add("Sundaraman");
				
names.add("Charlie");
				
names.add("Yuki");
		
//External iteration of collections
		
for (String name : names) 
{
	System.out.println(name);
}
		
//Output :
		
//Charlie
//Douglas
//Sundaraman
//Charlie
//Yuki
		
//Internal iteration of streams. No for loops

names.stream().map(String::toUpperCase).forEach(System.out::println);
				
//Output :
				
//CHARLIE
//DOUGLAS
//SUNDARAMAN
//CHARLIE
//YUKI

4) Transversal

Los flujos solo se pueden atravesar una vez. Si atraviesas el arroyo una vez, se dice que se consume. Para atravesarlo nuevamente, debe obtener una nueva transmisión de la fuente nuevamente. Sin embargo, las colecciones se pueden recorrer varias veces.

List<Integer> numbers = Arrays.asList(4, 2, 8, 9, 5, 6, 7);
		
Stream<Integer> numbersGreaterThan5 = numbers.stream().filter(i -> i > 5);
		
//Traversing numbersGreaterThan5 stream first time
		
numbersGreaterThan5.forEach(System.out::println);
		
//Second time traversal will throw error
		
//Error : stream has already been operated upon or closed
		
numbersGreaterThan5.forEach(System.out::println);

5) Construcción entusiasta versus construcción perezosa

Las colecciones se construyen con entusiasmo, es decir, todos los elementos se calculan al principio. Sin embargo, los flujos se construyen con pereza, es decir, las operaciones intermedias no se evalúan hasta que se invoca la operación terminal.

List<Integer> numbers = Arrays.asList(4, 2, 8, 9, 5, 6, 7);
				
numbers.stream().filter(i -> i >= 5).limit(3).forEach(System.out::println);

//Here, not all numbers are evaluated.
//numbers are evaluated until 3 numbers >= 5 are found.
		
//Output :
		
//8
//9
//5

Diferencia entre colecciones y secuencias en Java:

Colecciones Transmisiones
Las colecciones se utilizan principalmente para almacenar y agrupar los datos. Los flujos se utilizan principalmente para realizar operaciones en datos.
Puede agregar o quitar elementos de las colecciones. No puede agregar o eliminar elementos de las transmisiones.
Las colecciones tienen que iterarse externamente. Las secuencias se iteran internamente.
Las colecciones se pueden recorrer varias veces. Los flujos solo se pueden atravesar una vez.
Las colecciones se construyen con entusiasmo. Las secuencias se construyen con pereza.
Ej:Lista, Conjunto, Mapa… Ej:filtrado, mapeo, coincidencia...

Leer también:

Interfaz frente a clase abstracta después de Java 8

Flujos de Java 8

Expresiones Lambda de Java 8

Interfaces funcionales de Java 8

Referencias de métodos de Java 8


Etiqueta Java