Apex控制流语句

Apex 提供了 if-else 语句、switch 语句和循环来控制 代码执行。语句通常按照它们出现的顺序逐行执行。 使用控制流语句,可以根据某个条件使 Apex 代码执行, 或者让代码块重复执行。

  • 条件 (If-else) 语句 Apex 中的条件语句
    的工作方式与 Java 类似。
  • Switch 语句 Apex 提供了一个语句
    ,用于测试表达式是否与多个值之一匹配,并相应地分支。switch
  • Loops
    Apex 支持五种类型的过程循环。

条件 (If-else) 语句

Apex 中的条件语句的工作方式与 Java 类似。

if ([Boolean_condition]) 
    // Statement 1
else
    // Statement 2

该部分始终是可选的,并且始终是可选的 具有最接近 .为 例:

elseif

Integer x, sign;
// Your code
if (x <= 0) if (x == 0) sign = 0; else sign = -1;

是 等效 自:

Integer x, sign;
// Your code
if (x <= 0) {
    if (x == 0) {
           sign = 0; 
    } else  {
           sign = -1;
    }
}

重复语句也是允许的。 为 例:

else if

if (place == 1) {
    medal_color = 'gold';
} else if (place == 2) {
    medal_color = 'silver';
} else if (place == 3) {
    medal_color = 'bronze';
} else {
    medal_color = null;
}

Switch 语句

Apex 提供了一个测试 表达式是否与多个值之一匹配,并相应地进行分支。

switch

语法为:

switch on expression {
    when value1 {		// when block 1
        // code block 1
    }	
    when value2 {		// when block 2
        // code block 2
    }
    when value3 {		// when block 3
        // code block 3
    }
    when else {		  // default block, optional
        // code block 4
    }
}

该值可以是单个值,也可以是多个值 值或 sObject 类型。例如:when

when value1 {
}
when value2, value3 {
}
when TypeName VariableName {
}

该语句计算表达式和 执行匹配值的代码块。如果没有匹配的值,则代码 块被执行。如果没有阻止,则不执行任何操作。switchwhenwhen elsewhen else

注意

没有落差。执行代码块后,语句将退出。switchApex 语句表达式可以是以下表达式之一 以下类型。

switch

  • 整数
  • s对象
  • 字符串
  • 枚举

当阻止

每个块都有一个值,即 expression 是匹配的。这些值可以采用以下形式之一。when

  • when {} (a when 块可以有 多个逗号分隔的文字子句)literal
  • 当 SObjectTypeidentifier {}
  • 什么时候enum_value {}

该价值对所有人来说都是合法的价值 类型。null

每个值必须是唯一的。例如 您只能在一个块子句中使用文本。一个块最多匹配一次。whenxwhenwhen

何时 Else 阻止

如果没有值与表达式匹配,则执行该块。whenwhen else

注意

Salesforce 建议包含块,尤其是枚举类型,尽管这不是必需的。 使用枚举生成语句时 托管包提供的值,则代码可能无法按预期方式运行,如果 新版本的包包含其他枚举值。您可以防止这种情况发生 问题,包括一个块 处理意外值。when elseswitchwhen else

如果包含块,则它必须是 语句中的最后一个块。when elseswitch

文本示例

您可以使用文本值进行切换 在 Integer、Long 和 String 类型上。字符串子句区分大小写。例如 “orange”与“ORANGE”的值不同。when

单值示例

下面的示例对值使用整数文本。when

switch on i {
   when 2 {
       System.debug('when block 2');
   }
   when -3 {
       System.debug('when block -3');
   }
   when else {
       System.debug('default');
   }
}

Null 值示例

由于 Apex 中的所有类型都可以为 null,因此值可以为 .whennull

switch on i {
   when 2 {
       System.debug('when block 2');
   }
   when null {
       System.debug('bad integer');
   }
   when else {
       System.debug('default ' + i);
   }
}

多值示例

Apex 语句没有 回退,但子句可以包括 要匹配的多个文本值。您还可以嵌套 Apex 语句以提供多个执行 子句中的路径。switchwhenswitchwhen

switch on i {
   when 2, 3, 4 {
       System.debug('when block 2 and 3 and 4');
   }
   when 5, 6 {
       System.debug('when block 5 and 6');
   }
   when 7 {
       System.debug('when block 7');
   }
   when else {
       System.debug('default');
   }
}

方法示例

以下示例不是打开变量表达式,而是打开 方法调用的结果。

switch on someInteger(i) {
   when 2 {
       System.debug('when block 2');
   }
   when 3 {
       System.debug('when block 3');
   }
   when else {
       System.debug('default');
   }
}

sObjects 示例

通过打开 sObject 值,可以隐式执行检查和强制转换。例如 请考虑以下使用 if-else 语句的代码。instanceof

if (sobject instanceof Account) {
    Account a = (Account) sobject;
    System.debug('account ' + a);
} else if (sobject instanceof Contact) {
    Contact c = (Contact) sobject;
    System.debug('contact ' + c);
} else {
    System.debug('default');
}

您可以使用以下语句替换和简化此代码。switch

switch on sobject {
   when Account a {
       System.debug('account ' + a);
   }
   when Contact c {
       System.debug('contact ' + c);
   }
   when null {
       System.debug('null');
   }
   when else {
       System.debug('default');
   }
}

注意

每个块只能使用一种 sObject 类型。when

枚举示例

使用枚举值的语句不需要块,但建议这样做。您可以 每个块使用多个枚举值 第。switchwhenwhen elsewhen

switch on season {
   when WINTER {
       System.debug('boots');
   }
   when SPRING, SUMMER {
       System.debug('sandals');
   }
   when else {
       System.debug('none of the above');
   }
}

循环

Apex 支持五种类型的过程循环。支持以下类型的过程循环:

  • do {statement} while (Boolean_condition);
  • while (Boolean_conditionstatement;
  • for (initializationBoolean_exit_conditionincrementstatement;
  • for (variable : array_or_setstatement;
  • for (variable : [inline_soql_query]) statement;

所有环路都允许环路控制结构:

  • break;退出整个循环
  • continue;跳到下一个迭代 的循环
  1. Do-While 循环
  2. While 循环
  3. For 循环

Do-While 循环

Apex 循环重复执行 代码块,只要特定的布尔条件保持为真。其语法 是:

do-while

do {
   code_block
} while (condition);

注意

大括号 () 是 始终需要围绕 .{} code_block

与 Java 一样,Apex 循环没有 检查布尔条件语句,直到执行第一个循环之后。 因此,代码块始终至少运行一次。do-while例如,以下代码将数字 1 – 10 输出到调试中 日志:

Integer count = 1;

do {
    System.debug(count);
    count++;
} while (count < 11);

While 循环

Apex 循环重复执行一个块 只要特定的布尔条件保持为真。其语法 是:

while

while (condition) {
    code_block
}

注意

仅当块包含多个大括号 () 时,才需要在 a 周围加上大括号 () 陈述。{} code_block

与 不同的是,循环检查布尔条件语句 在执行第一个循环之前。因此,代码块可以 从不执行。do-whilewhile例如,以下代码将数字 1 – 10 输出到调试中 日志:

Integer count = 1;

while (count < 11) {
    System.debug(count);
    count++;
}

For 循环

Apex 支持循环的三种变体:

for

  • 传统循环:forfor (init_stmt; exit_condition; increment_stmt) { code_block }
  • 列表或设置迭代循环:forfor (variable : list_or_set) { code_block }其中必须是相同的基元或 sObject 类型为 。 variable list_or_set
  • SOQL 循环:forfor (variable : [soql_query]) { code_block }for (variable_list : [soql_query]) { code_block }两者必须属于相同的 sObject 类型 返回的 . variable variable_list soql_query

注意

仅当块包含多个大括号 () 时,才需要在 a 周围加上大括号 () 陈述。{} code_block

以下各节将进一步讨论每种方法。

  • 传统 For 循环
  • 列出或设置循环的迭代
  • 迭代集合

传统 For 循环

Apex 中的传统循环对应于 Java 和其他语言中使用的传统语法。其语法 是:

for

for (init_stmt; exit_condition; increment_stmt) {
    code_block
}

执行此类循环时,Apex 运行时引擎按顺序执行以下步骤:

for

  1. 执行循环的组件。请注意, 可以在此语句中声明和/或初始化多个变量。 init_stmt
  2. 执行检查。如果为 true,则循环 继续。如果为 false,则循环退出。 exit_condition
  3. 执行 . code_block
  4. 执行语句。 increment_stmt
  5. 返回到步骤 2。

例如,以下代码将数字 1 – 10 输出到调试日志中。注意 一个额外的初始化变量, 包含以演示语法:

j

for (Integer i = 0, j = 0; i < 10; i++) {
    System.debug(i+1);
}

列出或设置循环的迭代

列表或设置迭代循环循环 列表或集合中的所有元素。其语法 是:

for

for (variable : list_or_set) {
    code_block
}

其中必须具有相同的基元或 sObject 类型 如。

 variable list_or_set

执行此类循环时,Apex 运行时引擎将 分配给 中的每个元素,并运行 for each 值。for variable list_or_set code_block例如,以下代码将数字 1 – 10 输出到调试日志:

Integer[] myInts = new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

for (Integer i : myInts) {
    System.debug(i);
}

迭代集合

集合可以由列表、集合或地图组成。修改集合的 元素,而不支持循环访问该集合 并导致错误。请勿在以下情况下直接添加或删除元素 循环访问包含它们的集合。

在迭代期间添加元素

要添加 元素,在迭代列表、集合或映射时,保留新元素 在临时列表中,设置或映射并将它们添加到原始列表之后 完成循环访问。

在迭代期间删除元素

删除 元素,创建一个新列表,然后复制 您希望保留的元素。或者,添加您想要的元素 删除到临时列表并在完成迭代后将其删除 集合。

注意

该方法以线性方式执行。用它来删除元素有时间和 资源影响。List.remove

在迭代时删除元素 地图或集合,将要删除的键保存在临时列表中, 然后在完成循环访问集合后删除它们。

参考