Comparable 接口
为包含非原始类型的List添加排序支持,即用户定义类型的List。
白话 —— 个人理解,谨慎分析
Comparable接口是Salesforce中用于自定义对象排序的重要接口。
当你有一个自定义类的List时,如果想要使用sort()方法排序,就需要实现这个接口。
命名空间
System
用法
要为您的Apex类添加List排序支持,您必须在类中实现Comparable接口及其compareTo方法。
白话 —— 个人理解,谨慎分析
实现Comparable接口需要两个步骤:
- 在类声明中使用implements关键字
- 实现compareTo方法
要实现Comparable接口,您必须首先使用implements关键字声明一个类,如下所示:
public class Employee implements Comparable {
// 类成员和方法
}
接下来,您的类必须为以下方法提供实现:
public Integer compareTo(Object compareTo) {
// 您的代码在这里
}
实现的方法必须声明为global或public。
示例
以下示例实现了Comparable接口。此示例中的compareTo方法比较此类实例的员工与参数中传递的员工。该方法基于员工ID的比较返回一个Integer值。
public class Employee implements Comparable {
public Long id;
public String name;
public String phone;
// 构造函数
public Employee(Long i, String n, String p) {
id = i;
name = n;
phone = p;
}
// 实现compareTo()方法
public Integer compareTo(Object compareTo) {
Employee compareToEmp = (Employee)compareTo;
if (id == compareToEmp.id) return 0;
if (id > compareToEmp.id) return 1;
return -1;
}
}
此示例测试Employee对象列表的排序顺序:
@isTest
private class EmployeeSortingTest {
@isTest
static void test1() {
List<Employee> empList = new List<Employee>();
empList.add(new Employee(101,'Joe Smith', '4155551212'));
empList.add(new Employee(101,'J. Smith', '4155551212'));
empList.add(new Employee(25,'Caragh Smith', '4155551000'));
empList.add(new Employee(105,'Mario Ruiz', '4155551099'));
// 使用自定义compareTo()方法排序
empList.sort();
// 将列表内容写入调试日志
System.debug(empList);
// 验证列表排序顺序
Assert.areEqual('Caragh Smith', empList[0].Name);
Assert.areEqual('Joe Smith', empList[1].Name);
Assert.areEqual('J. Smith', empList[2].Name);
Assert.areEqual('Mario Ruiz', empList[3].Name);
}
}
Comparable 方法
以下是Comparable的方法。
compareTo(objectToCompareTo)
返回比较结果的Integer值。
白话 —— 个人理解,谨慎分析
compareTo方法是Comparable接口的核心方法,它定义了如何比较两个对象。
返回值决定了排序的顺序:负数表示当前对象排在前面,正数表示排在后面,0表示相等。
签名
public Integer compareTo(Object objectToCompareTo)
参数
objectToCompareTo
- 类型:Object
- 描述:要与此实例比较的对象
返回值
- 类型:Integer
- 描述:比较结果
用法
此方法的实现返回以下值:
- 0:如果此实例和objectToCompareTo相等
0:如果此实例大于objectToCompareTo
- < 0:如果此实例小于objectToCompareTo
如果此对象实例和objectToCompareTo不兼容,则抛出System.TypeException。
示例
// 按姓名排序的compareTo实现
public Integer compareTo(Object compareTo) {
Employee compareToEmp = (Employee)compareTo;
if (this.name == compareToEmp.name) return 0;
if (this.name > compareToEmp.name) return 1;
return -1;
}
// 按多个字段排序的compareTo实现
public Integer compareTo(Object compareTo) {
Employee compareToEmp = (Employee)compareTo;
// 首先按部门排序
if (this.department != compareToEmp.department) {
return this.department.compareTo(compareToEmp.department);
}
// 如果部门相同,按姓名排序
return this.name.compareTo(compareToEmp.name);
}
注意事项
- 您的实现必须在compareTo()方法中明确处理null输入,以避免空指针异常
- 实现的方法必须声明为global或public
- 如果对象不兼容,会抛出TypeException
- 建议在compareTo方法中实现一致的排序逻辑
文档来源:https://developer.salesforce.com/docs/atlas.en-us.apexref.meta/apexref/apex_comparable.htm