Apex Academy
Módulo 1·07·24 min

Operadores

Los símbolos que hacen cuentas, comparan y deciden. Incluido el que te deja poner un valor por defecto sin escribir un solo if.

En Admin esUna regla de validación: AND(), OR(), NOT() e IF()

✓ En esta sub-lección

  1. 01No volver a confundir = con ==.
  2. 02Combinar condiciones con && y || y aprovechar que se evalúan en corto.
  3. 03Sustituir un valor ausente por uno por defecto con el operador condicional.

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

Region__c viene vacío. ¿Qué pasa con incompleteLead.Region__c.toUpperCase()?

Una regla de validación es una expresión con operadores: AND(ISBLANK(Region__c), NOT(ISPICKVAL(Status, 'Closed'))). Ya sabes razonar así. Apex usa los mismos conceptos con símbolos más cortos, y añade uno que en fórmulas conocías como IF().

String stage = 'Prospecting';

stage vale →'Prospecting'

Paso 1 de 4

Partimos de una oportunidad en fase Prospecting. Un solo igual GUARDA un valor en la variable.

Un carácter de diferencia entre guardar un valor y preguntar por él.

Aritméticos

Suma, resta, multiplicación y división. Y una ausencia que sorprende a quien viene de otros lenguajes: Apex no tiene operador de módulo. Para el resto de una división se usa el método Math.mod().

Apex
Decimal amount = 1000;
Decimal withTax = amount * 1.21;
Decimal perQuarter = amount / 4;
Integer remainder = Math.mod(17, 5);   // 2: no existe el operador %

También existen las formas abreviadas: amount += 100 significa exactamente amount = amount + 100. Funcionan con +=, -=, *= y /=, y se leen mejor cuando la variable es larga.

Comparación: uno o dos iguales

Un solo igual asigna: pone un valor dentro de una variable. Dos iguales comparan: preguntan si dos cosas valen lo mismo y devuelven un Boolean. Es el error de tecleo más caro del lenguaje, porque a veces compila igualmente.

OperadorPreguntaDevuelve
== !=¿Son iguales? ¿Son distintos?Boolean
< > <= >=¿Es menor, mayor…?Boolean
&&¿Se cumplen las dos?Boolean
||¿Se cumple al menos una?Boolean
!Lo contrario de…Boolean
Apex
Decimal amount = 25000;
String stage = 'Closed Won';

Boolean isBigDeal = amount >= 20000;
Boolean isWon = stage == 'Closed Won';
Boolean celebrate = isBigDeal && isWon;
Boolean pending = !isWon;
Guardar cada condición en un Boolean con buen nombre convierte una expresión ilegible en una frase.

Evaluación en corto: tu red de seguridad

Apex evalúa && de izquierda a derecha y para en cuanto sabe la respuesta. Si la primera condición es falsa, la segunda ni se mira. Eso convierte al && en la forma idiomática de protegerse de un null: primero compruebas que existe, después lo usas.

Apex
String region = null;

// Seguro: si el primero es false, el segundo no llega a ejecutarse
Boolean isEmea = region != null && region.toUpperCase() == 'EMEA';

// Peligroso: el orden invertido explota
Boolean broken = region.toUpperCase() == 'EMEA' && region != null;
El orden de las condiciones no es estético: es lo que separa un código que aguanta de uno que cae.

String region = null;

region != null…
&&
region.toUpperCase() == 'EMEA'…

Boolean isEmea =?

Paso 1 de 4

region vale null. Apex lee la condición de izquierda a derecha.

Reprodúcelo con los tres escenarios. Fíjate en cuándo la parte derecha ni siquiera llega a ejecutarse.

La nutria: Como las condiciones de entrada de un Flow

Cuando yo hacía Flows desencadenados por registro, las condiciones de entrada decidían si el Flow ni siquiera arrancaba: si el registro no las cumplía, ningún elemento de dentro llegaba a ejecutarse. region != null && … funciona igual: la primera condición es la condición de entrada, y lo que va detrás del && solo corre si la supera. (Simplificación: en un Flow no tienes que preocuparte del orden de las condiciones; en Apex es justo lo que te protege).

El operador condicional: IF() en una línea

Se escribe condición ? valorSiVerdadero : valorSiFalso, y es una expresión: produce un valor que puedes guardar directamente en una variable. Es el equivalente exacto de IF() en una fórmula, y resuelve el problema que dejó abierto la sub-lección anterior: qué poner cuando falta el dato.

Apex
String region = incompleteLead.Region__c;

// En fórmulas: BLANKVALUE(Region__c, 'Sin región')
String displayRegion = String.isBlank(region) ? 'Sin región' : region;

Decimal amount = opp.Amount;
Decimal safeAmount = amount == null ? 0 : amount;

La nutria: Lo mismo que hacías en el campo fórmula

IF(ISBLANK(Region__c), 'Sin región', Region__c) lo escribí mil veces en campos fórmula, y String.isBlank(region) ? 'Sin región' : region es la misma decisión escrita de otra forma. La diferencia es que en Apex el resultado se guarda en una variable que puedes reutilizar diez líneas más abajo.