Apex Academy
Módulo 1·03·22 min

String y qué es un método

El texto es el tipo con el que más vas a pelear. Antes de listar sus herramientas, hay que entender qué es exactamente una «herramienta» en Apex.

En Admin esLas funciones de fórmula: TRIM(), UPPER(), CONTAINS()

✓ En esta sub-lección

  1. 01Explicar qué es un método y qué devuelve, sin recurrir a ejemplos.
  2. 02Usar los métodos de String más habituales para limpiar y componer texto.
  3. 03Encadenar y anidar métodos, y leer cualquier combinación paso a paso como lees una fórmula anidada.
  4. 04Saber por qué comparar textos con == en Apex sorprende a todo el mundo una vez.

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

Vas a guardar el importe de un contrato. ¿Qué tipo usas?

Si alguna vez escribiste TRIM(LastName) o UPPER(Country) en un campo fórmula, ya has usado métodos sin llamarlos así. La diferencia es de puntuación: donde la fórmula pone la función delante, Apex la pega detrás del dato.

Qué es un método

Un método es una acción con nombre que un dato sabe hacer consigo mismo. Se escribe pegado al dato con un punto, lleva paréntesis (siempre, aunque estén vacíos) y devuelve algo: un texto nuevo, un número, un sí o un no. Dentro de los paréntesis van los datos extra que necesita: trim() ninguno, replace('a', 'b') dos.

rawName.toUpperCase();

EL ORIGINAL (rawName)

  • vale' acme corp '

LO QUE DEVUELVE

  • valor(aún nada)
  • guardado—

Paso 1 de 5

El dato. Aquí es una variable de texto, pero podría ser un campo de un registro o el resultado de otro método. Lo importante es su tipo: un String solo sabe hacer cosas de String.

El dato entra, el método actúa, y lo que sale es un valor nuevo. El original se queda como estaba.

Ese último detalle confunde al principio: un String es . Ningún método lo cambia por dentro; todos devuelven un texto nuevo, así que si no guardas el resultado, el trabajo se pierde.

Apex
String rawName = '  acme corp  ';

rawName.trim();                    // se calcula… y se tira
String cleanName = rawName.trim(); // se calcula y se guarda

Escribir texto y los métodos de cada día

El texto va entre comillas simples, no dobles; si necesitas una comilla dentro, se escribe con una barra invertida delante. Para unir textos se usa el signo más, igual que en una fórmula se usa el ampersand.

Apex
String owner = 'María';
String note = 'Cuenta de ' + owner + ': Northwind';   // 'Cuenta de María: Northwind'
String quoted = 'El cliente dijo \'sí\' ayer';     // El cliente dijo 'sí' ayer
MétodoQué devuelveSu primo en fórmulas
length()Integer: cuántos caracteres.LEN()
trim()String sin espacios al principio ni al final.TRIM()
toUpperCase() / toLowerCase()String en mayúsculas o minúsculas.UPPER() / LOWER()
contains('texto')Boolean: si aparece dentro.CONTAINS()
startsWith(…) / endsWith(…)Boolean: si empieza o acaba así.BEGINS()
substring(0, 3)String: un trozo, desde una posición hasta otra.MID() / LEFT()
replace('a', 'b')String con todas las apariciones sustituidas.SUBSTITUTE()
capitalize()String con la primera letra en mayúscula; el resto se queda tal cual estaba.Sin equivalente directo

Encadenar: un método detrás de otro

Lo que devuelve un método es un dato nuevo, y a ese dato le puedes pedir otro método con otro punto. rawCompany.trim().substring(0, 4).toUpperCase() se lee de izquierda a derecha: cada paso actúa sobre lo que devolvió el anterior.

String companyCode = rawCompany.trim().substring(0, 4).toUpperCase();
  1. ' northwind trading 'String

Paso 1 de 4

Punto de partida: el dato tal cual llega del formulario web, con espacios y en minúsculas. Una cadena se lee de izquierda a derecha.

En un campo fórmula: UPPER(LEFT(TRIM(rawCompany), 4)). Se escribe de fuera hacia dentro, pero ocurre en el mismo orden.

Pulsa Reproducir o avanza paso a paso: lo que sale de un paso es lo único que entra en el siguiente. Cambia a «Anidar» para ver el orden de dentro hacia fuera, que se explica más abajo.

La nutria: Como anidar funciones en una fórmula, pero al derecho

Yo ya hacía esto en fórmulas: UPPER(LEFT(Company, 4)) primero recorta y luego pone en mayúsculas, aunque lo escribas de fuera hacia dentro. En Apex se escribe en el mismo orden en que ocurre, de izquierda a derecha. A mí me resultó más fácil de seguir.
Apex
String rawCompany = '  northwind trading  ';

// Desarmada: un paso por línea, cada resultado con nombre
String trimmed = rawCompany.trim();          // 'northwind trading'
String firstFour = trimmed.substring(0, 4);  // 'nort'
String code1 = firstFour.toUpperCase();      // 'NORT'

// Encadenada: los mismos tres pasos, en una línea
String code2 = rawCompany.trim().substring(0, 4).toUpperCase(); // 'NORT'
code1 y code2 valen lo mismo. Si una cadena no te sale, desármala: el paso que falla queda a la vista.

String es una clase que ya trae Apex

La nutria: Como un objeto estándar

Así lo entendí yo: String es como Account. No lo creas tú, viene con Apex y ya trae sus «botones», que son sus métodos. Cada texto concreto, como 'Ana Torres', es como un registro. Y hay dos tipos de botón: los que se pulsan en un registro (nombre.trim(): «este texto, límpiate») y los que se pulsan en el objeto, como «Nuevo» (String.valueOf(42): «clase String, fabrícame un texto con esto»). Simplificación: un registro se guarda en la base de datos; un texto solo vive mientras corre tu código.

Los métodos de la clase llevan el dato dentro de los paréntesis. Dos te van a acompañar todo el curso: String.isBlank(), que funciona aunque el texto ni siquiera exista, y String.valueOf(), el TEXT() de tus fórmulas, que convierte un número o una fecha en texto.

Apex
String region = '   ';
Integer total = 42;

Boolean empty = String.isBlank(region);   // true: vacío, solo espacios o null
String a = total;                         // ✗ no compila: 42 es un número, no un texto
String b = String.valueOf(total);         // ✓ '42'
String c = 'Total: ' + total;             // ✓ al pegarlo con +, Apex lo convierte solo
Regla práctica: si el número va solo a una variable String, necesitas String.valueOf(); si lo pegas a un texto con +, no. La sub-lección de Casting vuelve a esto con calma.

Anidar: un método dentro de los paréntesis de otro

Una llamada a un método ES un valor, así que puede ir dentro de los paréntesis de otra. Aquí la lectura sí es de dentro hacia fuera, como en una fórmula: Apex resuelve primero lo de dentro y le pasa el resultado al de fuera.

Apex
String rawName = '  ana torres  ';

String lengthText = String.valueOf(rawName.trim().length());
//   primero rawName.trim().length()  → 10
//   después String.valueOf(10)       → '10'

Boolean found = rawName.contains('TORRES'.toLowerCase());   // contains('torres') → true

La nutria: Mi truco para leer cualquier línea

TEXT(LEN(TRIM(Name))) en una fórmula es exactamente String.valueOf(name.trim().length()). Para leer cualquier línea busco el paréntesis más interno, lo resuelvo en la cabeza y lo sustituyo por su valor. Repito hasta que no queda nada.

Comparar textos: la sorpresa de Apex

En Apex, == entre textos no distingue mayúsculas: 'EMEA' == 'emea' es verdadero, casi al revés que en cualquier otro lenguaje. Si la mayúscula importa, usa equals(); si quieres dejar claro que no importa, equalsIgnoreCase().

Apex
Boolean loose  = 'EMEA' == 'emea';          // true
Boolean strict = 'EMEA'.equals('emea');     // false
Boolean same   = 'EMEA'.equalsIgnoreCase('emea'); // true, y se lee mejor que ==

La nutria: Por qué esto te suena

Es lo mismo que un filtro de informe: Industry igual a «technology» también saca los «Technology». Cómodo casi siempre… y yo caí la vez que comparaba códigos donde la mayúscula sí significaba algo.