lunes, 2 de julio de 2018

Java 8 y los stream: iniciación


Siguiendo con los posts de Java 8, vamos a continuar con otra de las grandes innovaciones de que trae. En este caso los java.util.stream, que incluye clases para sequencias de elementos. Veremos varios ejemplos y así paso a paso veremos de una forma pŕactica su utilidad y el sentido de para que se creo. 

La interfaz 'Collection' ha sido modificada para incluir un método 'stream()' que permita la creación a partir de una. 

List<String> list = Arrays.asList("uno", "dos", "tres");
Stream<String> stream = list.stream();
Stream<String> streamBis = Stream.of("uno", "dos", "tres");

Los streams nos permitirán iterar disminuyendo el código a escribir y aportando legitibilidad.

stream.forEach(element -> System.out.println(element));
//returns uno, dos, tres

También nos provee de un método que nos permite filtrar y generar otro stream con los valores del primero que cumplan los requisitos del filtro

Stream<String> filterStream = stream.filter(element -> element.equals("uno"));
filterStream.forEach(element -> System.out.println(element));
//return uno

También podemos crear un stream de otro tipo en base a un stream existente. Para ello haremos uso del método 'map' que nos permitirá hacer la conversión.

Stream<Boolean> booleanStream = stream.map(element -> element.equals("uno"));
booleanStream.forEach(element -> System.out.println(element));
//returns true, false, false

También nos provee varios métodos para encontrar coincidencias en una sequencia. Dichos métodos nos devolverán unicamente un valor booleano.

stream = Stream.of("uno", "dos", "tres"); //return true
System.out.println(stream.anyMatch(element -> element.contains("o")));
stream = Stream.of("uno", "dos", "tres"); //return false
System.out.println(stream.allMatch(element -> element.contains("o")));
stream = Stream.of("uno", "dos", "tres"); //return false
System.out.println(stream.noneMatch(element -> element.contains("o")));

Nos provee de un método denominado 'reduce' que permite realizar una operación con cada elemento de la sequencia, añadiendo además un valor inicial.

System.out.println(stream.reduce("Numeros: ", (a, b) -> a + b + " "));
// return 'Numeros: uno dos tres '

A trav'es del método 'collect' podremos convertir un stream en un objeto del tipo 'Collection'.

List<String> list = stream.collect(Collectors.toList());
System.out.println(list);
//return [uno, dos, tres]

Por último una característica muy notable de estos nuevos stream. Y es que podemos iterar por la secuencia de forma paralela.

list.parallelStream().forEach(element -> System.out.println(element));
//posible salida: dos, uno, tres

No hay comentarios:

Publicar un comentario