Java 8 Stream map flatMap y filter

By | 03/19/2018

Stream map te permite leer cada elemento y transformar los valores que se encuentran en el Stream entregandote otro Stream con el resultado para seguir realizando operaciones.

Cómo usar Stream map

Como puedes ver en el ejemplo a continuación map() recibe una función como parámetro para realizar alguna transformación sobre cada elemento y devuelve otro Stream sobre el cual puedes seguir trabajando.

Observa en el ejemplo a continuación transformamos cada elemento en un String en mayúscula y luego lo colocamos en una nueva lista.

List<String> fruits = Arrays.asList(
    "apple", "banana", "cherry", "lemon", "peach");

List<String> fruitsUpper = fruits.stream().map(String::toUpperCase)
    .collect(Collectors.toList());
System.out.print(fruitsUpper);
// [APPLE, BANANA, CHERRY, LEMON, PEACH]

Otro ejemplo en donde el resultado será las tres primeras letras de cada String.

List<String> fruitsFirstLetters= fruits.stream().map(f -> f.substring(0,3)).collect(Collectors.toList());
System.out.println(fruitsFirstLetters);
// [app, ban, che, lem, pea]

Podemos realizar transformaciones de objetos en algo distinto, recibiendo en la lambda expresión el objeto como parámetro y haciendo algo con él. Por ejemplo, extraer valor de un atributo de un objeto.

List<User> users = Arrays.asList(new User("Hamilton"), new User("Thompson"),
       new User("Stallman"), new User("Torvalds"));

List<String> stringNames = users.stream().map(user -> user.getName()).map(String::toUpperCase)
       .collect(Collectors.toList());
System.out.println(stringNames);
// [HAMILTON, THOMPSON, STALLMAN, TORVALDS]

Cómo usar Stream flatMap

Podemos encontrarnos con estructuras algo más complejas. Por ejemplo, una lista con otra
lista.

List<List<String>> programmers = Arrays.asList(
       Arrays.asList("Margaret", "Hamilton"),
       Arrays.asList("Ken", "Thompson"),
       Arrays.asList("Richard", "Stallman"),
       Arrays.asList("Linus", "Torvalds"));

Si obtienes un Stream de esta lista obtendrías otro Stream con una lista

Stream<List<String>> streamWithList = programmers.stream();

Con flatMap lo que haces es un “flatten”, aplanar el resultado. Por ejemplo, aquí aplanamos List y nos quedamos con un Stream “plano”.

{ {"Margaret","Hamilton"}, {"Ken","Thompson"}, ... } -> flatMap -> {"Margaret","Hamilton","Ken","Thompson", ...}
List<String> flatList = programmers.stream().flatMap(Collection::stream).collect(Collectors.toList());
System.out.println(flatList);
// [Margaret, Hamilton, Ken, Thompson, Richard, Stallman, Linus, Torvalds]

Cómo usar Stream filter

Filter aplica un predicado sobre cada elemento y si cumple la condición lo agrega a un nuevo Stream.
Aquí transformas un Stream en otro nuevo Stream con solo elementos que empiezan con “b”

Stream<String> streamWithB = fruits.stream().filter(f -> f.startsWith("b"));
List<String> listWithB = streamWithB.collect(Collectors.toList());
System.out.println(listWithB);
// [banana]

Conclusión

Has visto cómo crear un Stream y transformar cada dato del Stream en algo distinto usando map. También cómo aplanar un Stream complejo para obtener un Stream plano y sobre él seguir realizando operaciones.
Por último, cómo filtrar resultados aplicando un predicado para los elementos que cumplan con tu condición.

Código de ejemplo:
/j8/streams

Compartir esto:

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *