Skip to main content

控制数据流

学习目标

完成本单元后,您将能够:

  • 列出比较运算符的用法。
  • 描述 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 i = 2;

一个等于号 ( = ) 是一个赋值运算符。它会进行赋值。两个等于号 ( == ) 是一个比较运算符。它对两个值进行比较以确定它们是相等(真)还是不相等(假)。

当您想将一个已知值与一个变量进行比较,或比较两个不同变量的值时,运算符尤其有用。

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 伪代码中使用一个条件语句来检查茶壶中的水位,并根据水位决定下一步该怎么做。

  1. 在 Developer Console 中,单击 Debug(调试)| Open Execute Anonymous Window(打开执行匿名窗口)
  2. 复制此代码并将其粘贴到“输入 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');
    }
  3. 选择打开日志复选框,然后单击执行。执行日志将打开,显示代码运行的结果。
  4. 选择窗口底部的仅调试复选框。

在第 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 条件。让我们来看一个实际的例子。

  1. 在 Developer Console 中,单击 Debug(调试)| Open Execute Anonymous Window(打开执行匿名窗口)
  2. 复制此代码并将其粘贴到“输入 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');
    }
  3. 选择打开日志复选框,然后单击执行。执行日志将打开,显示运行代码的结果。
  4. 选择窗口底部的仅调试复选框。

在测试代码时,更改第 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 伪代码。

  1. 在 Developer Console 中,单击 Debug(调试)| Open Execute Anonymous Window(打开执行匿名窗口)
  2. 复制此代码并将其粘贴到“输入 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!');
        }
    }
  3. 选择打开日志复选框,然后单击执行。执行日志将打开,显示运行代码的结果。
  4. 选择窗口底部的仅调试复选框。

逻辑运算符

您已经了解了如何处理两个或多个条件。现在,当一个条件可以被一个以上的值满足时,您该如何做?

逻辑运算符

运算符 OR AND
运算符符号 || &&
伪代码 如果 X OR Y,这样做。
否则,那样做。
如果 X AND Y,这样做。
否则,那样做。
Apex 代码 if(X || Y) {
//do this
} else {
//do this
}

if(X && Y) {
//do this
} else {
//do this
}

逻辑运算符 andor 使您能够通过编写代码来检查多个值,以确定一个条件为真还是假。运算符 and 要求所有值都为真才能满足条件。运算符 or 要求至少有一个值为真才能满足条件。

评估逻辑运算符

逻辑运算符 语法 描述
&& (AND)
X && Y

System.debug(true && true); // true

System.debug(false && true); //false

System.debug(true && false); // false

System.debug(false && false); //false
X 和 Y 是布尔值。如果 X 和 Y 均为真,则该表达式为真。否则该表达式为假。
|| (OR)
X || Y

System.debug(true || true); //true

System.debug(false || true); //true

System.debug(true || false); //true

System.debug(false || false); //false
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(半满))为真时条件得到满足。

  1. 在 Developer Console 中,单击 Debug(调试)| Open Execute Anonymous Window(打开执行匿名窗口)
  2. 复制此代码并将其粘贴到“输入 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');
    }
  3. 选择打开日志复选框,然后单击执行。执行日志将打开,显示运行代码的结果。
  4. 选择窗口底部的仅调试复选框。

好吧,看这个。我们删除了冗余代码。使用逻辑运算符 (&& and ||) 是删除或减少冗余代码并提高可读性的有效方法。

保持代码整洁

在编程中,您通常有不止一种方法来达到某种目的。例如,您可以使用 switch 语句或 if-else 语句,并得到相同的结果。当您选择要使用的语句类型时,务必要考虑每种语句对代码可读性的影响。随着您继续编写代码,您将了解到更多保持代码整洁的方法。现在,请将重点放在使代码易于阅读和理解上。

资源

在 Salesforce 帮助中分享 Trailhead 反馈

我们很想听听您使用 Trailhead 的经验——您现在可以随时从 Salesforce 帮助网站访问新的反馈表单。

了解更多 继续分享反馈