Apex基础之数据类型和变量

Posted 乄清雅轩灬

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Apex基础之数据类型和变量相关的知识,希望对你有一定的参考价值。

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相同的原始数据类型,所有原始数据类型都按值传递。

所有的先端变量,不管它们是类成员变量还是方法变量,都被初始化为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类型变量的创建一般通过以下几种方式:

  • 如果作为查询的一部分创建,那么scale值(小数点位数)由查询语句返回的结果的scale值决定
  • 如果将字符串转换成Decimal,那么字符串中.后面的字符个数就是scale值
  • 如果非十进制的数(non-decimal)想转换成Decimal,那么先将数字转换成字符串,再根据字符串中.后的字符个数确定scale值
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 32位的数字,不含小数点,范围-2 ^63~2 ^63-1,在初始化Long类型的变量时,要在数字后加L,如:Long l = 2147483648L;
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;

  • 与Java不同,除了用户定义类型,==在Apex中比较对象的值,而不是引用,在比较时需要注意:
  1. 使用==比较字符串时不区分大小写
  2. 使用==比较ID时严格区分大小写,并且不区分15个字符和18个字符的格式
  3. 用户定义的类型通过引用进行比较,这意味着两者 只有在内存中引用相同的位置时,对象才相等。可以通过重写其equals()和hasCode()方法实现值比较
  • 对于sObject和sObject数组集合,以及collections和内置的Apex对象,使用==比较时除了比较对象外,还会比较对象中的字段是否相等
  • 使用==比较records,records中的每个字段都要相等才会返回true
  • 任何两个值的比较都不会是null(只能是true或false)
  • 在SOQL和SOSL中使用=判断一个字段的的值,这个其实就是条件语句中的条件
=== 如果x和y在内存中引用了相同的位置,返回true,否则返回false
<

如果x小于y,返回true,否则返回false,对于<运算符,需要注意

  • 任何两个值的比较结果不会为null
  • 如果想x,y是Integer,Double,Date,DateTime类型,并且x或者y中的任意一个值为null,那么表达式返回false,如:

  Integer a,b,c=0;

  a<c;//false

  c<b;//false

  • 任何非空的String,ID类型的变量都比null大
  • 如果x,y都是ID类型,那么他们进行比较时必须是同一种object类型(如都是指向Account对象的ID类型)的ID,否则会报错
  • 如果x,y有一个是String,另一个是ID,则将String当做ID类型进行比较
  • x,y不能是Boolean类型
  • 两字符串比较时比区分大小写
>

如果x大于y,返回true,否则返回false,对于>运算符,注意内容与<运算符一致

<= 如果x小于等于y,返回true,否则返回false,对于<=运算符,注意内容与<运算符一致
>= 如果x大于等于y,返回true,否则返回false,对于>=运算符,注意内容与<运算符一致
!=

如果x的值不等于y的值,返回true,否则返回false,对于!=运算符,注意内容与==运算符一致

!==  如果x和y不引用内存中相同的位置,返回true,否则返回false

 

以上是关于Apex基础之数据类型和变量的主要内容,如果未能解决你的问题,请参考以下文章

Apex基础之Classes

Python基础之注释变量Debug调试数据类型

Python基础之变量,常量,注释,数据类型

《C#零基础入门之百识百例》(六十二)结构体类型变量 -- 学生数据记录

java基础之变量详解

python基础之变量类型和数据运算