For Loop y sus variantes
Recorrer una lista registro a registro: el elemento Loop de Flow, en una línea. Y el for clásico, para cuando cuentas vueltas.
✓ En esta sub-lección
- 01Recorrer una List, un Set o los valores de un Map con un for-each.
- 02Escribir un for clásico con sus tres partes cuando lo que cuentas son vueltas.
- 03Aplicar los dos patrones más útiles dentro de un bucle: acumular y filtrar.
La nutria: ¿Te acuerdas? · Repaso de la lección 4
En un while, ¿qué pasa si nada dentro del cuerpo cambia la condición?
Casi todo el Apex real hace lo mismo: recibe una lista de registros y hace algo con cada uno. Un trigger recibe hasta un ; una consulta devuelve una lista. El bucle for es la herramienta para eso, y es el que más vas a escribir.
La nutria: El paralelo de Admin
For-each: un registro cada vez
List<Opportunity> opps = new List<Opportunity>{
new Opportunity(Name = 'Acme', Amount = 12000),
new Opportunity(Name = 'Globex', Amount = 45000)
};
for (Opportunity opp : opps) {
System.debug(opp.Name + ': ' + opp.Amount);
}for (Opportunity opp : opps) {
total += opp.Amount;
if (opp.StageName == 'Negotiation') inNegotiation++;
}- opp →Northwind · RenovaciónNegotiation24.500
- Acme · LicenciasProspecting40.000
- Initech · PlantaNegotiation120.000
- Globex · PilotoQualification15.000
total
0
inNegotiation
0
Paso 1 de 5
Vuelta 1 de 4: opp es «Northwind · Renovación». Se suma su importe y, como está en Negotiation, cuenta también.
Tú no llevas la cuenta de nada: el bucle hace tantas como elementos haya, en orden, y si la lista está vacía no entra ni una vez. El tipo del elemento actual tiene que coincidir con el de la colección: para una List<Contact>, el elemento es un Contact. Y en la mayoría de org, esa lista vendrá de una consulta ; aquí la construimos a mano porque eso llega en el Módulo 3.
Recorrer un Set o un Map
Un Set se recorre igual que una List, aunque sin orden garantizado. Un Map no se recorre directamente: le pides una de sus dos caras. keySet() devuelve el Set de claves y values() la List de valores.
Map<String, Decimal> quotaByRegion = new Map<String, Decimal>{
'EMEA' => 500000,
'APAC' => 300000
};
for (String region : quotaByRegion.keySet()) {
System.debug(region + ' → ' + quotaByRegion.get(region));
}
Decimal totalQuota = 0;
for (Decimal quota : quotaByRegion.values()) {
totalQuota += quota;
}Los dos patrones que más vas a usar
Acumular: declaras un total antes del bucle y le sumas algo en cada vuelta. Filtrar: declaras una lista vacía antes del bucle y le añades solo los elementos que cumplen una condición. En los dos casos la variable se declara fuera: si la declarases dentro, se reiniciaría en cada vuelta y moriría al terminar, como viste en ámbito.
Decimal openPipeline = 0; // acumular
List<Opportunity> bigDeals = new List<Opportunity>(); // filtrar
for (Opportunity opp : opps) {
Decimal amount = opp.Amount ?? 0;
openPipeline += amount;
if (amount >= 40000) {
bigDeals.add(opp);
}
}El for clásico: contar vueltas
Cuando lo que necesitas es un número que va avanzando (generar 12 cuotas mensuales, o saber en qué posición de la lista estás), el for clásico tiene tres partes separadas por punto y coma: dónde empieza el contador, mientras qué condición sigue, y cuánto avanza tras cada vuelta.
for (Integer month = 1; month <= 12; month++) {
System.debug('Cuota del mes ' + month);
}
for (Integer i = 0; i < opps.size(); i++) {
System.debug((i + 1) + '. ' + opps[i].Name);
}| Necesitas… | Usa |
|---|---|
| Hacer algo con cada registro de una lista | for (Tipo x : lista) |
| Un número que avanza, o la posición | for (Integer i = 0; …; i++) |
| Repetir hasta que un valor cambie | while |