Apex Academy
Módulo 1·08·28 min

Colecciones: List, Set y Map

Una variable guarda un dato. Estas tres guardan muchos, y elegir mal entre ellas es lo que separa el código que aguanta 200 registros del que no.

En Admin esLista relacionada, agrupación de informe y cruce por Id

✓ En esta sub-lección

  1. 01Elegir entre List, Set y Map según la pregunta que tengas que responder.
  2. 02Crear colecciones y añadir, leer y consultar sus elementos.
  3. 03Anticipar qué devuelve un Map cuando la clave no existe.

La nutria: ¿Te acuerdas? · Repaso de la lección 7

Si region vale ' ' (solo espacios), ¿qué devuelve String.isBlank(region) ? 'Sin región' : region?

Abre una cuenta y mira la lista relacionada de contactos: filas en un orden, con posibles repeticiones de nombre. Abre el filtro de un informe por Industry: valores únicos, sin repetir. Y piensa en cómo cruzas dos exportaciones por Id. Acabas de recorrer List, Set y Map.

Cómo se declara una colección

Una colección declara dos cosas: qué tipo de colección es y qué guarda dentro, entre los símbolos de mayor y menor. List<String> es «una lista de textos» y no aceptará números. Es la misma promesa del tipo de la primera sub-lección, aplicada al contenido.

Apex
List<String> regions = new List<String>();
List<String> stages = new List<String>{ 'Prospecting', 'Closed Won' };
Set<Id> accountIds = new Set<Id>();
Map<Id, Account> accountsById = new Map<Id, Account>();
Las llaves permiten crear la colección ya con contenido. Sin ellas, nace vacía pero lista para usarse.

List: orden y posiciones

Una List mantiene el orden en que metiste las cosas y admite repetidos. Cada elemento tiene una posición, empezando en 0, igual que substring, y por la misma convención.

MétodoQué haceDevuelve
add(valor)Añade al final.nada
get(0) o lista[0]Lee la posición indicada.el elemento
size()Cuántos elementos hay.Integer
isEmpty()¿Está vacía?Boolean
contains(valor)¿Está dentro?Boolean
sort()Ordena la lista en el sitio.nada
Apex
List<String> pipeline = new List<String>();
pipeline.add('Prospecting');
pipeline.add('Negotiation');
pipeline.add('Prospecting');        // repetido: la List lo acepta

Integer howMany = pipeline.size();  // 3
String first = pipeline.get(0);     // 'Prospecting'
Boolean empty = pipeline.isEmpty(); // false
Fíjate en que add() no devuelve nada: modifica la lista. Las colecciones sí cambian por dentro, al contrario que los String.

Set: sin repetidos

Un Set ignora los duplicados: si añades dos veces el mismo valor, sigue habiendo uno. A cambio, no tiene posiciones (no puedes pedirle «el tercero») y no garantiza el orden. Es la colección que usas cuando la pregunta es «¿está esto aquí?» o «¿cuáles son los valores distintos?».

Apex
Set<String> industries = new Set<String>();
industries.add('Technology');
industries.add('Retail');
industries.add('Technology');          // se descarta

Integer distinct = industries.size();  // 2
Boolean hasRetail = industries.contains('Retail');  // true

La nutria: El Set que ya usabas sin saberlo

Yo usaba Sets sin saberlo: cuando agrupas un informe por Industry, la columna de grupos es un Set, porque cada valor aparece una vez aunque haya 4.000 cuentas detrás. Y cuando en Apex quieras recoger los Ids de cuenta de para de una vez, el Set es lo que evita pedir el mismo Id veinte veces.

Map: buscar por clave

Un Map guarda parejas: una clave y un valor. Le das la clave y te devuelve el valor, sin recorrer nada. Es el cruce por Id que harías en una hoja de cálculo, pero instantáneo, y es la estructura que sostiene prácticamente todo el Apex de producción.

Apex
Map<String, Decimal> quotaByRegion = new Map<String, Decimal>();
quotaByRegion.put('EMEA', 150000);
quotaByRegion.put('AMER', 220000);

Decimal emeaQuota = quotaByRegion.get('EMEA');      // 150000
Boolean hasApac = quotaByRegion.containsKey('APAC'); // false
Integer regions = quotaByRegion.size();              // 2
Apex
Decimal apacQuota = quotaByRegion.get('APAC');        // null
Decimal safeQuota = quotaByRegion.containsKey('APAC')
    ? quotaByRegion.get('APAC')
    : 0;                                                  // 0
List<String> regionList = new List<String>();
Set<String> regionSet = new Set<String>();
Map<String, Decimal> quotaByRegion = new Map<String, Decimal>();

LIST · ORDEN Y REPETIDOSsize() = 0

    SET · SIN REPETIDOSsize() = 0

      MAP · CLAVE → VALORsize() = 0

        Paso 1 de 9

        Tres colecciones vacías. List es una lista relacionada: orden y repetidos. Set es la columna de agrupación de un informe: valores únicos. Map es un BUSCARV: das la clave y te devuelve el valor.

        Ahora las tres a la vez, paso a paso: los mismos valores entran en una List y en un Set, y después en un Map. Fíjate en qué pasa con el segundo 'EMEA'.

        Cuál elegir

        Si necesitas…UsaPorque
        Conservar el orden o admitir repetidosListEs la única con posiciones.
        Valores únicos, o preguntar «¿está?»SetDescarta duplicados por diseño.
        Encontrar algo por una claveMapResponde sin recorrer la colección.