Java Stream Collectors y su uso

Cuanto más usamos los streams más usamos los diferentes Java Stream Collectors para transformar estos. Vamos a ver cuales son las diferentes opciones que Java soporta para transformar  un stream a otro tipo de estructura. Para ello nos vamos a crear la clase Libro y usarla en diferentes ejemplos.


package com.arquitecturajava;

public class Libro {

	private String titulo;
	private int paginas;
	
	
	public Libro(String titulo, int paginas) {
		super();
		this.titulo = titulo;
		this.paginas = paginas;
	}
	public String getTitulo() {
		return titulo;
	}
	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}
	public int getPaginas() {
		return paginas;
	}
	public void setPaginas(int paginas) {
		this.paginas = paginas;
	}
}


package com.arquitecturajava;

import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Principal {

 public static void main(String[] args) {
 
 
 Libro l1= new Libro ("El señor de los anillos",1000);
 Libro l2= new Libro ("La fundacion",500);
 Libro l3= new Libro ("El caliz de fuego",600);
 
 }
}

Acabamos de instanciar tres objetos ,vamos a añadir todos a un stream y recorrerlo utilizando el método forEach.


		Stream<Libro> st = Stream.of(l1, l2, l3);
		st.forEach((l) -> System.out.println(l.getTitulo()));

El resultado se imprimirá por la consola:
Sin Java Stream Collectors

En muchas ocaciones no queremos simplemente imprimir un resultado sino que lo que queremos es convertir el Stream a un tipo de dato para su posterior gestión .

Java Stream Collectors

Vamos a ver algunas opciones, una de las más sencillas es convertirlo a un array  con el método toArray() :


Libro[] arrayLibro= st.toArray(Libro[]::new);
 
 for(int i=0;i<arrayLibro.length;i++) {
 
 System.out.println(arrayLibro[i].getPaginas());
 }
 

Este código obtendrá un array de objetos a partir del Stream y lo imprimirá por la consola:

Java Stream Collectors resultado

Java Stream Collectors

De igual forma que  podemos convertir el Stream a un array, podemos usar los Java Stream Collectors y convertir nuestro stream a una Lista o Conjunto , utilizando la clase Collectors y su método toList() o toSet().

 


 List<Libro> lista= st.collect(Collectors.toList());
 
 for (Libro l:lista) {
 
 System.out.println(l.getTitulo());
 }
 

 



 Set<Libro> lista = st.collect(Collectors.toSet());

 for (Libro l : lista) {

 System.out.println(l.getTitulo());
 }

El resultado es idéntico:

Acabamos  de usar dos de los métodos fundamentales de Collectors para generar Sets y List a partir de un Stream.

Java Stream Collector flujo

Los Java Stream collectors nos permiten realizar operaciones más complejas con poco código . Por ejemplo podemos obligar a que todos los títulos de los Libros se impriman en una única linea usando el método joining de la clase Collectors.


String resultado = st.map((l) -> l.getTitulo()).collect(Collectors.joining(","));

 System.out.println(resultado);

La consola mostrará:

Podemos complicarlo más y sumar todas las páginas de los libros utilizando el método reducing de Collectors.


Optional<Integer> resultado3 = st.map((l) -> l.getPaginas()).collect(Collectors.reducing(Integer::sum));

System.out.println(resultado3.get());

Vemos en consola el sumatorio de todas  las páginas de todos los libros:

Hay muchas opciones pero la clase Collectors es una de las indispensables a la hora de trabajar con Streams y transformarlos.

Otros artículos relacionados : Programación Funcional, Java 8 Streams , Java 8 Lambda y forEach (II) , El concepto de Java infinite Stream

About Cecilio Álvarez Caules

Cecilio Álvarez Caules Sun Certified Enterprise Architech (J2EE/JEE).

Sin comentarios todavía.

Deja un comentario

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies