Apex数据类型
1)原始数据类型,Integer, Double, Long, Date, Datetime, String, ID, Boolean等
2)sObject,要么作为通用的sObject使用(Account, Contact),要么作为特定的sObject使用(MyCustomObject__c)
3)collection,包括
list(array),set,map
4)enum
5)由用户自定义的Apex代码生成的Object
6)由系统提供的Apex代码生成的Object
7)null
原始数据类型
Apex使用与SOAP API相同的原始数据类型,所有原始数据类型都按值传递。
所有的Apex变量,不管它们是类成员变量还是方法变量,都被初始化为null。在使用这些变量之前,先将它们设置为适当的值。例如,将布尔变量初始化为false。Apex的原始数据类型包括:
Data Type | Description |
Blob | 一个二进制数据集合,存储为一个单个的object,可以调用String的toString()和valueOf()方法将该类型转换为字符串,Blob类型可以用作Web Service参数 |
Boolean | Apex的布尔类型有三个值,true,false,null,默认值为null,所以在使用布尔变量前一定要先初始化 |
Date | 表示某一天的值,与DataTime不同的是,Date不显示时间,Date型的变量都是通过调用系统静态方法创建的;Date类型能且只能与整数进行加减算术运算并返回Date类型的值;两个或多个Date变量运算需要调用Date类中的方法 |
Datetime | 表示某天的日期和时间,与timestemp一样;DateTime型的变量都是通过调用系统静态方法创建的;DateTime类型能且只能与整数(Integer)或双精度浮点数(Double)进行加减算术运算并返回Date类型的值,两个或多个DateTime变量运算需要调用DateTime类中的方法 |
Decimal |
任意精度(arbitrary precision)的小数,一般货币值会被定义为Decimal类型,Decimal类型变量依照小数点的位数创建,依照的依据称为scale,可以使用setScale()方法指定scale值;Decimal类型变量的创建一般通过以下几种方式:
|
Double | 包含小数点的64位数字。范围从-2 ^63~2 ^63-1,Double类型不支持科学计数法的表示方法 |
ID | 任何有效的Force.com记录标识符,长度18,即使将ID值长度设为15,Apex也会将其转换成18个字符的表示形式,任何非18个字符的非法ID都会引发异常处理 |
Integer | 32位的数字,不含小数点,范围-2,147,483,648~2,147,483,647 |
Long | 64位的数字,不含小数点,范围-2 ^63~2 ^63-1,在初始化Long类型的变量时,要在数字后加L,如:Long l = 2147483648L;不加L也可以,默认自动将Integer转换成Long |
Object | 所有其他数据类型都继承与Object |
String |
Apex中字符串被单引号包括;String没有长度限制,但是API版本15后,字符串过长编译器也会报错; Apex中的String变量可以是字符串、空串,null,而且字符串首尾都可以有空格,但是在sObject的String类型字段和SOAP API中,不能有空串(可以是null),首尾不可以有空格 Apex中的字符串比较时,除了==外,还有>、>=、<、<=、!= |
Time | 表示特定时间的值;使用系统静态方法创建Time |
另外,还有两个非标准的原始数据类型不能作为变量或方法返回值类型使用,但在系统静态方法中会出现:
1)AnyType 专门用于Force.com数据库中字段历史追踪表中的sObject字段,可以通过调用valueOf()静态方法将AnyType类型的sObject字段转换成标准的原始类型变量
2)Currency 可以通过调用Currency.newInstance()静态方法生成一个Currency类型的变量,但是这个方法只能在SOQL和SOSL语句的WHERE子语句中查询currency类型的字段时使用,其他任何Apex代码中都不支持
Collections
List
List是由它们的索引区分的有序元素集合。列表元素可以是任何类型的数据类型, 集合、sObjects、用户定义类型和内置的Apex类型,
List可以嵌套List,最多可以嵌套四层(五维),当List只有一维时,List和数组可以看成是一个东西,下面的声明是正确的:
Account[] accList = new List<Account>();
可以调用List.sort()方法对List元素排序,对于字符串,是按照字典升序排序;
对于VisualForce的SelectOption控件,排序由value和label共同决定,首先由value的值升序排序,当有两个value相同或者value都是空,就按照label值升序排序,如:
List<SelectOption> options = new List<SelectOption>(); options.add(new SelectOption('A','United States')); options.add(new SelectOption('C','Canada')); options.add(new SelectOption('A','Mexico')); System.debug('Before sorting: ' + options); options.sort(); System.debug('After sorting: ' + options);
测试结果:
DEBUG|Before sorting: (System.SelectOption[value="A", label="United States", disabled="false"], System.SelectOption[value="C", label="Canada", disabled="false"], System.SelectOption[value="A", label="Mexico", disabled="false"]) DEBUG|After sorting: (System.SelectOption[value="A", label="Mexico", disabled="false"], System.SelectOption[value="A", label="United States", disabled="false"], System.SelectOption[value="C", label="Canada", disabled="false"])
Set
Set集合是不包含任何重复的元素的无序集合。Set元素可以是任何类型的数据类型, 集合、sObjects、用户定义类型和内置的Apex类型,Set集合也可以多层嵌套,最多嵌套4层
Set集合的声明方式:
Set<DataType> set = new Set<DataType>();
调用add()方法添加元素,也可以在声明set时填充集合
Set<String> set1 = new Set<String>{'a','b','c'};
Set<String> set2 = new Set<String>(set1);//用set1初始化set2
Map
map是键值对的集合,其中每个键值都映射到一个值。键和值可以是原始数据类型、集合、sObjects、用户定义类型和内置的Apex类型
Map的初始化:
Map<String,String> map = new Map<String,String>(){'a' => 'b','c' => 'd'};
变量
Apex中的变量被声明后如果不初始化,其初始值都是null
Apex变量不区分大小写
Integer I;
Integer i;//报错
另外,对sObject对象和字段的引用也不区分大小写,如
Account a1;
ACCOUnt a2;
SOQL和SOSL语句也不区分大小写,如:
Account[] accts = [sELect ID From ACCouNT where nAme = 'fred'];
因此,在字符串比较时,'a' == 'A'的结果是true,值的注意的是
String str;
System.debug(str < 'A');
上述返回值为true,理论上str的值为null,不能参与比较,但是Apex在他们进行运算符的比较时,将str当做空格字符串处理,但是如果调用
s.compareTo('A');
就会产生错误
类型转化
Apex中的隐式类型转换:对于数字类型,精度由低到高依次是Integer,Long,Double,Decimal,低精度的类型可以自动转换为高精度类型,
另外ID类型的值常自动转换成String类型,String类型的值也可以隐式转换成ID类型,但是在运行期间,会将该值进行检查,如果不是合法的ID类型,则抛出异常,可以使用instanceOf判断一个字符串是否为ID
除了数字和ID,其他类型的转换,必须调用string.format()方法
运算符
Apex运算符基本与Java中的运算符用法一样,但算数运算符中+,-运算符在Date,DateTime的运算中很特殊,在前面介绍原始数据类型中已经讲过,除此之外,Apex的比较运算符也比较特殊,Apex中的比较运算符有==,===,<,<=,>,>=,!=,!==
比较运算符 | 说明 |
== |
如果x的值等于y的值,表达式求值 为true。否则,表达式计算为false;
|
=== | 如果x和y在内存中引用了相同的位置,返回true,否则返回false |
< |
如果x小于y,返回true,否则返回false,对于<运算符,需要注意
Integer a,b,c=0; a<c;//false c<b;//false
|
> |
如果x大于y,返回true,否则返回false,对于>运算符,注意内容与<运算符一致 |
<= | 如果x小于等于y,返回true,否则返回false,对于<=运算符,注意内容与<运算符一致 |
>= | 如果x大于等于y,返回true,否则返回false,对于>=运算符,注意内容与<运算符一致 |
!= |
如果x的值不等于y的值,返回true,否则返回false,对于!=运算符,注意内容与==运算符一致 |
!== | 如果x和y不引用内存中相同的位置,返回true,否则返回false |