Repository navigation
Expand file tree
/
Copy pathExpFlatMap.java
More file actions
106 lines (85 loc) · 4.29 KB
/
Copy pathExpFlatMap.java
File metadata and controls
106 lines (85 loc) · 4.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import java.util.*;
import java.util.stream.*;
public class ExpFlatMap {
public static void main(String[] args) {
// ======================================
// 1. map vs flatMap — la diferencia clave
// ======================================
List<String> frases = List.of("hola mundo", "java es genial", "stream api");
// map produce Stream<String[]> — un stream de arrays, no de palabras
Stream<String[]> conMap = frases.stream()
.map(f -> f.split(" "));
System.out.println("map → tipo: Stream<String[]>, elementos: " + conMap.count());
// flatMap aplana: cada String[] se convierte en Stream<String> y se fusionan
List<String> palabras = frases.stream()
.flatMap(f -> Arrays.stream(f.split(" ")))
.toList();
System.out.println("flatMap → palabras: " + palabras);
// ======================================
// 2. Lista de órdenes con ítems — aplanar estructura anidada
// ======================================
List<Orden> ordenes = List.of(
new Orden("O1", List.of("Laptop", "Ratón", "Teclado")),
new Orden("O2", List.of("Monitor")),
new Orden("O3", List.of("Auriculares", "Webcam"))
);
// Sin flatMap necesitaríamos dos bucles anidados
List<String> todosLosItems = ordenes.stream()
.flatMap(o -> o.items().stream()) // cada Orden → Stream<String> de sus ítems
.toList();
System.out.println("Todos los ítems: " + todosLosItems);
// Contar ítems únicos en todas las órdenes
long itemsUnicos = ordenes.stream()
.flatMap(o -> o.items().stream())
.distinct()
.count();
System.out.println("Ítems únicos: " + itemsUnicos);
// ======================================
// 3. Optional.stream() con flatMap — filtrar Optionals vacíos
// ======================================
List<Optional<String>> conOpcionales = List.of(
Optional.of("Spring"),
Optional.empty(),
Optional.of("Kafka"),
Optional.empty(),
Optional.of("Docker")
);
// Optional.stream() devuelve Stream de 0 o 1 elemento
// flatMap lo aplana, eliminando los vacíos de forma limpia
List<String> soloPresentes = conOpcionales.stream()
.flatMap(Optional::stream)
.toList();
System.out.println("Sin vacíos: " + soloPresentes);
// ======================================
// 4. Fusionar colecciones con Stream.of + flatMap
// ======================================
List<String> backendDevs = List.of("Jorex", "Ana", "Miguel");
List<String> frontendDevs = List.of("Sara", "Pablo");
List<String> devops = List.of("Carlos");
List<String> todosDevs = Stream.of(backendDevs, frontendDevs, devops)
.flatMap(Collection::stream)
.sorted()
.toList();
System.out.println("Todos los devs: " + todosDevs);
// ======================================
// 5. DEMO FINAL — frecuencia de palabras en párrafos
// ======================================
List<String> parrafos = List.of(
"java stream flatMap aplana listas",
"flatMap es diferente de map en java",
"stream api hace el código más limpio"
);
Map<String, Long> frecuencia = parrafos.stream()
.flatMap(p -> Arrays.stream(p.split(" ")))
.collect(Collectors.groupingBy(
s -> s, // clave = la propia palabra
Collectors.counting() // valor = cuántas veces aparece
));
System.out.println("\n--- Frecuencia de palabras ---");
frecuencia.entrySet().stream()
.filter(e -> e.getValue() > 1) // solo las que aparecen más de una vez
.sorted(Map.Entry.<String, Long>comparingByValue().reversed())
.forEach(e -> System.out.println(" " + e.getKey() + ": " + e.getValue()));
}
record Orden(String id, List<String> items) {}
}