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
{ {"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.
Puedes ver este código en github y gitlab