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