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:
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 .
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
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.
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.
Optiona<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 :
puta mierda
buenas, porque seria importante poner el super(); en el constructor de la clase Libro?
Saludos, buenos tutoriales.
Intentare escribir algo en el blog sobre ello
La palabra super siempre esta implicita en cualquier constructor