1
+ /**
2
+ * Demostración de diferentes mecanismos de iteración en Dart
3
+ *
4
+ * Dart proporciona varios mecanismos de iteración, combinando
5
+ * sintaxis familiar con características únicas del lenguaje.
6
+ */
7
+
8
+ import 'dart:io' show stdout;
9
+
10
+ void main () {
11
+ print ('=== Demostración de Mecanismos de Iteración en Dart ===\n ' );
12
+
13
+ // 1. Bucle for tradicional
14
+ print ('1. Usando bucle for tradicional:' );
15
+ void forLoop () {
16
+ for (int i = 1 ; i <= 10 ; i++ ) {
17
+ stdout.write ('$i ' );
18
+ }
19
+ print ('' ); // Nueva línea
20
+ }
21
+ forLoop ();
22
+
23
+ // 2. Bucle while
24
+ print ('\n 2. Usando bucle while:' );
25
+ void whileLoop () {
26
+ int contador = 1 ;
27
+ while (contador <= 10 ) {
28
+ stdout.write ('$contador ' );
29
+ contador++ ;
30
+ }
31
+ print ('' );
32
+ }
33
+ whileLoop ();
34
+
35
+ // 3. Bucle do-while
36
+ print ('\n 3. Usando bucle do-while:' );
37
+ void doWhileLoop () {
38
+ int num = 1 ;
39
+ do {
40
+ stdout.write ('$num ' );
41
+ num ++ ;
42
+ } while (num <= 10 );
43
+ print ('' );
44
+ }
45
+ doWhileLoop ();
46
+
47
+ // 4. forEach con List
48
+ print ('\n 4. Usando forEach con List:' );
49
+ void forEachLoop () {
50
+ List <int > numeros = List .generate (10 , (index) => index + 1 );
51
+ numeros.forEach ((numero) => stdout.write ('$numero ' ));
52
+ print ('' );
53
+ }
54
+ forEachLoop ();
55
+
56
+ // 5. for-in loop
57
+ print ('\n 5. Usando for-in loop:' );
58
+ void forInLoop () {
59
+ var numeros = List .generate (10 , (index) => index + 1 );
60
+ for (var numero in numeros) {
61
+ stdout.write ('$numero ' );
62
+ }
63
+ print ('' );
64
+ }
65
+ forInLoop ();
66
+
67
+ // 6. Usando Iterable.generate
68
+ print ('\n 6. Usando Iterable.generate:' );
69
+ void iterableGenerate () {
70
+ var numeros = Iterable .generate (10 , (index) => index + 1 );
71
+ numeros.forEach ((numero) => stdout.write ('$numero ' ));
72
+ print ('' );
73
+ }
74
+ iterableGenerate ();
75
+
76
+ // 7. Usando map
77
+ print ('\n 7. Usando map:' );
78
+ void mapExample () {
79
+ var numeros = List .generate (10 , (index) => index + 1 );
80
+ numeros.map ((numero) => stdout.write ('$numero ' )).toList ();
81
+ print ('' );
82
+ }
83
+ mapExample ();
84
+
85
+ // 8. Usando Iterador personalizado
86
+ print ('\n 8. Usando Iterador personalizado:' );
87
+ class NumberIterator implements Iterator <int > {
88
+ int _current = 0 ;
89
+
90
+ @override
91
+ int get current => _current;
92
+
93
+ @override
94
+ bool moveNext () {
95
+ if (_current < 10 ) {
96
+ _current++ ;
97
+ return true ;
98
+ }
99
+ return false ;
100
+ }
101
+ }
102
+
103
+ class NumberIterable extends Iterable <int > {
104
+ @override
105
+ Iterator <int > get iterator => NumberIterator ();
106
+ }
107
+
108
+ void customIterator () {
109
+ var numbers = NumberIterable ();
110
+ for (var number in numbers) {
111
+ stdout.write ('$number ' );
112
+ }
113
+ print ('' );
114
+ }
115
+ customIterator ();
116
+
117
+ // 9. Usando async* para generar un stream
118
+ print ('\n 9. Usando async* para generar un stream:' );
119
+ Stream <int > countStream () async * {
120
+ for (int i = 1 ; i <= 10 ; i++ ) {
121
+ yield i;
122
+ }
123
+ }
124
+
125
+ void streamExample () async {
126
+ await for (var number in countStream ()) {
127
+ stdout.write ('$number ' );
128
+ }
129
+ print ('' );
130
+ }
131
+ // Nota: Este ejemplo es asíncrono y no se ejecutará en orden
132
+ streamExample ();
133
+
134
+ // 10. Usando recursión
135
+ print ('\n 10. Usando recursión:' );
136
+ void recursion (int n) {
137
+ if (n <= 10 ) {
138
+ stdout.write ('$n ' );
139
+ recursion (n + 1 );
140
+ }
141
+ }
142
+ recursion (1 );
143
+ print ('' );
144
+
145
+ // EXTRA: Ejemplo con Dart Collection Methods
146
+ print ('\n 11. Bonus: Usando métodos de colección de Dart:' );
147
+ void dartCollectionMethods () {
148
+ var numeros = List .generate (10 , (index) => index + 1 );
149
+
150
+ // where para filtrar
151
+ print ('Números pares:' );
152
+ numeros.where ((n) => n.isEven).forEach ((n) => stdout.write ('$n ' ));
153
+ print ('' );
154
+
155
+ // take para obtener los primeros n elementos
156
+ print ('Primeros 5 números:' );
157
+ numeros.take (5 ).forEach ((n) => stdout.write ('$n ' ));
158
+ print ('' );
159
+
160
+ // skip para saltar elementos
161
+ print ('Saltando los primeros 5 números:' );
162
+ numeros.skip (5 ).forEach ((n) => stdout.write ('$n ' ));
163
+ print ('' );
164
+ }
165
+ dartCollectionMethods ();
166
+ }
167
+
168
+ /**
169
+ * NOTAS SOBRE LAS CARACTERÍSTICAS ÚNICAS DE DART:
170
+ *
171
+ * 1. Dart tiene soporte nativo para streams con async* y yield
172
+ * 2. Los tipos son obligatorios para las variables públicas
173
+ * 3. Las colecciones en Dart son muy potentes y tienen muchos métodos útiles
174
+ * 4. Dart tiene un sistema de tipos sound null safety
175
+ * 5. La sintaxis para iteración es similar a otros lenguajes, pero con
176
+ * algunas peculiaridades propias de Dart
177
+ */
178
+
179
+ /**
180
+ * MEJORES PRÁCTICAS PARA ITERACIÓN EN DART:
181
+ *
182
+ * 1. Usar for-in cuando sea posible, es más legible
183
+ * 2. Aprovechar los métodos de colección como where, map, etc.
184
+ * 3. Considerar el uso de streams para datos asíncronos
185
+ * 4. Implementar Iterable cuando se necesite una colección personalizada
186
+ * 5. Usar final o const cuando sea posible para variables
187
+ */
0 commit comments