控制数据流
学习目标
完成本单元后,您将能够:
- 列出比较运算符的用法。
- 描述 switch 语句和 if-else 语句之间的差异。
在日常生活中,我们总是需要做决定。我穿什么?我吃什么?我应该向左还是向右?写代码时也是如此。回想一下第一单元中的 Teateme 伪代码,特别是步骤 2 中的。
Boil water in a Tea Kettle Fill Kettle with Water Switch Kettle On Wait for Water to Boil
嗯,一切看起来都很准确,对吧?为了烧水,我将茶壶注满水,打开开关,等水烧开。但是如果茶壶里已经有水了呢?如果茶壶中的水满了怎么办?水应该烧多久?
表达式和表达式运算符
在做决定之前,我们经常会进行比较。这个比那个大吗?这个与那个相等吗?开发人员在针对应用程序做决策之前,通常会比较价值在代码中,我们使用表达式运算符将两个表达式进行比较。
表达式是一段代码,当对其求值时,它将产生单个值。在本模块中,表达式可能是文字表示值(如 12)、变量(如 numberOfTeaCups)或数学运算(如 7 x 4)。
表达式运算符比较或显示两个值之间的相等性。比较语句包含两个由表达式运算符隔开的表达式,并生成一个布尔值(True(真) 或 False(假))。
比较运算符
运算符 | 描述 | 语法 | 结果 |
---|---|---|---|
< |
小于 |
1 < 2 |
TRUE |
<= |
小于或等于 |
1 <= 2 3 <= 3 |
TRUE |
== |
等于 |
10 == 10 |
TRUE |
!= <> |
不等于 |
10 != 0 10 <> 11 |
TRUE |
> |
大于 |
11 > 10 |
TRUE |
>= |
大于或等于 |
40 >=10 40 >= 40 |
TRUE |
为什么等于运算符有两个等于号?请记住,我们在这个语句中使用了一个等于号:
一个等于号 ( =
) 是一个赋值运算符。它会进行赋值。两个等于号 ( ==
) 是一个比较运算符。它对两个值进行比较以确定它们是相等(真)还是不相等(假)。
当您想将一个已知值与一个变量进行比较,或比较两个不同变量的值时,运算符尤其有用。
Integer numberOfTeaCups = 2; numberOfTeaCups == 3; //false numberOfTeaCups == 2; //true
我们看到了一个涉及整数变量和字符串变量的例子。我们还可以创建一个布尔变量来保存比较的结果。请看一下:
Integer numberOfTeaCups = 2; Boolean result = numberOfTeaCups > 3; // 2 > 3 = false
第 1 行将 numberOfTeaCups 变量设为 2。
第 2 行创建了一个名为 result
(结果)的布尔型变量,将 numberOfTeaCups 变量值与数字 3 进行比较,并将比较结果(假)赋予 result
(结果)变量。
尽管比较有助于确定一件事与另一件事的关系,但它们在条件语句中发挥的作用最为突出,在那里我们能通过比较做决定。
条件语句
开发人员在条件语句中使用表达式来创建决策结构,该结构指定程序要评估或测试的一个或多个条件。哇,这真是太棒了。我们来细分一下。
一个条件语句设置两个或多个选项。如果您曾经在 Flow Builder 中创建条件,那么您就已经使用过条件语句了。例如,“如果 State 等于 California,则在列表视图中显示记录”就是一个条件语句。“State 等于 California”是条件,“在列表视图中显示记录”是程序只有在条件为真时才会采取的操作。在本例中,两个选项分别是显示记录(显式)和不显示记录(隐含的)。
If-Else 语句
Apex 中一个常用的条件语句是 if-else
语句。它看起来是这样的:
if(condition is true) { //do this } else { //do this }
第 1 行定义条件(写在圆括号中)。
第 2 行包含第 1 行中的条件为真时要运行的代码。
第 3 行介绍了第二个选项,即 else 选项。
第 4 行包含第 1 行中的条件为假时要运行的代码。
在 Apex 中,我们将条件语句置于花括号 { }
内。每一个左花括号 ({
) 都必须与右花括号 (}
) 成对出现。如果一个代码块只有左花括号而没有右花括号,则会发生错误。
让我们在 Teateme 伪代码中使用一个条件语句来检查茶壶中的水位,并根据水位决定下一步该怎么做。
- 在 Developer Console 中,单击 Debug(调试)| Open Execute Anonymous Window(打开执行匿名窗口)。
- 复制此代码并将其粘贴到“输入 Apex 代码”窗口中。
String waterLevel = 'full'; /*This variable keeps track of the water level status: full or empty*/ if(waterLevel == 'empty') { System.debug('Fill the tea kettle'); waterLevel = 'full'; /*Once the tea kettle is filled the variable is changed to full*/ } else { System.debug('The tea kettle is full'); }
- 选择打开日志复选框,然后单击执行。执行日志将打开,显示代码运行的结果。
- 选择窗口底部的仅调试复选框。
在第 1 行,我们将水位变量初始化为 full
(满)。通常,代码中的变量值由用户输入或来源于其他数据,而不是在代码中指定。在我们给出的 Teatime 示例中,我们将从茶壶中的传感器获取物理数据,用以确定水位。当这些数据不可用时,开发人员会直接在代码中设置值(临时),以便运行并测试代码。在代码中设置值称为硬编码。出于测试目的,我们将水位变量值硬编码为 full
(满)。由于已经设置了该值,第一个 if
语句(第 3 行)将不会运行,因为水位变量从一开始就不为 empty
(空)。
该代码检查水位变量是否为 empty
(空)。由于我们将水位变量值硬编码为 full
(满),if
语句条件为假。当 if
语句条件为假时,else
代码块将运行。
我们的代码目前处理两个选项:水位为 full
(满)和水位为 empty
(空)。但这些并不是唯一的可能性,对吧?茶壶可能处于半满状态。我们如何处理两种以上的可能性呢?
If-Else If 语句
我们使用 if-else if 语句来处理两种以上的可能性。If-else if 语句在最后的 else 条件之前添加了另一个 if 条件。让我们来看一个实际的例子。
- 在 Developer Console 中,单击 Debug(调试)| Open Execute Anonymous Window(打开执行匿名窗口)。
- 复制此代码并将其粘贴到“输入 Apex 代码”窗口中。
String waterLevel = 'half'; if(waterLevel == 'empty') { System.debug('Fill the tea kettle'); waterLevel = 'full'; } else if(waterLevel == 'half') { System.debug('Fill the tea kettle'); waterLevel = 'full'; } else { /*This statement only runs if line 3 and line 6 result in false.*/ System.debug('The tea kettle is full'); }
- 选择打开日志复选框,然后单击执行。执行日志将打开,显示运行代码的结果。
- 选择窗口底部的仅调试复选框。
在测试代码时,更改第 1 行中 waterLevel
(水位)变量的值。调试日志中的输出反映了此次更改。尝试所有三个值:half
(半满)、full
(满)和 empty
(空)。
排列条件语句,将第一个条件安排为最常见的条件。这种安排减少了每次执行代码块时运行的代码量。在我们给出的 Teatime 示例中,茶壶为空是最有可能出现的情况,所以我们把这个条件放在第一位。茶壶为满是最不可能出现的情况,因此这个条件被放在了最后。
Switch 语句
If-else 语句的一个更有效的替代方法是 Switch 语句。Switch 语句指定一组值,并测试表达式以确定其是否与其中一个值匹配。具体情况如下:
switch on expression { when value1 { //code block 1 } when value2 { //code block 2 } when else { //if none of the previous values apply //code block 3 } }
在 Switch 语句中,在保留字 when
之后可以有一个或多个值。
switch on expression { when value1 { //single value //code block 1 } when value2, value3 { //multiple values //code block 2 } }
让我们将 Switch 语句应用于我们的 Teatime 伪代码。
- 在 Developer Console 中,单击 Debug(调试)| Open Execute Anonymous Window(打开执行匿名窗口)。
- 复制此代码并将其粘贴到“输入 Apex 代码”窗口中。
String waterLevel = 'empty'; //option 1 using a single value switch on waterLevel { when 'empty' { System.debug('Fill the tea kettle'); } when 'half' { System.debug('Fill the tea kettle'); } when 'full' { System.debug('The tea kettle is full'); } when else { System.debug('Error!'); } } //option 2 using multiple values switch on waterLevel { when 'empty', 'half' { //when waterLevel is either empty or half System.debug('Fill the tea kettle'); } when 'full' { System.debug('The tea kettle is full'); } when else { System.debug('Error!'); } }
- 选择打开日志复选框,然后单击执行。执行日志将打开,显示运行代码的结果。
- 选择窗口底部的仅调试复选框。
逻辑运算符
您已经了解了如何处理两个或多个条件。现在,当一个条件可以被一个以上的值满足时,您该如何做?
逻辑运算符
运算符 | OR | AND |
运算符符号 | || | && |
伪代码 | 如果 X OR Y,这样做。 否则,那样做。 |
如果 X AND Y,这样做。 否则,那样做。 |
Apex 代码 |
if(X || Y) { |
if(X && Y) { |
逻辑运算符 and
和 or
使您能够通过编写代码来检查多个值,以确定一个条件为真还是假。运算符 and
要求所有值都为真才能满足条件。运算符 or
要求至少有一个值为真才能满足条件。
评估逻辑运算符
逻辑运算符 | 语法 | 描述 |
---|---|---|
&& (AND) |
X && Y |
X 和 Y 是布尔值。如果 X 和 Y 均为真,则该表达式为真。否则该表达式为假。 |
|| (OR) |
X || Y |
X 和 Y 是布尔值。如果 X 和 Y 均为假,则该表达式为假。否则该表达式为真。 |
让我们试试逻辑运算符。这是作为 if-else if 语句编写的代码。
String waterLevel = 'half'; if(waterLevel == 'empty') { System.debug('Fill the tea kettle'); waterLevel = 'full'; } else if(waterLevel == 'half') { System.debug('Fill the tea kettle'); waterLevel = 'full'; } else { //This statement only runs if line 3 and line 6 result in false. System.debug('The tea kettle is full'); }
看一下第 4-5 行和第 7-8 行。它们完全相同。我们将其称为冗余代码。最佳的做法是删除冗余代码,这样可使代码更具可读性,更易于理解、调试和维护。无论水位为 empty
(空)还是 half
(半满),我们的代码都执行相同的操作。我们可以将 empty
(空)和 half
(半满)合并为一个条件来简化此代码。我们使用的是 or
运算符,所以当其中一个值(empty
(空)或 half
(半满))为真时条件得到满足。
- 在 Developer Console 中,单击 Debug(调试)| Open Execute Anonymous Window(打开执行匿名窗口)。
- 复制此代码并将其粘贴到“输入 Apex 代码”窗口中。
String waterLevel = 'half'; if(waterLevel == 'empty' || waterLevel == 'half') { System.debug('Fill the tea kettle'); waterLevel = 'full'; } else { //This statement only runs if line 3 false. System.debug('The tea kettle is full'); }
- 选择打开日志复选框,然后单击执行。执行日志将打开,显示运行代码的结果。
- 选择窗口底部的仅调试复选框。
好吧,看这个。我们删除了冗余代码。使用逻辑运算符 (&&
and ||
) 是删除或减少冗余代码并提高可读性的有效方法。
保持代码整洁
在编程中,您通常有不止一种方法来达到某种目的。例如,您可以使用 switch 语句或 if-else 语句,并得到相同的结果。当您选择要使用的语句类型时,务必要考虑每种语句对代码可读性的影响。随着您继续编写代码,您将了解到更多保持代码整洁的方法。现在,请将重点放在使代码易于阅读和理解上。