映射变换(map):将某种操作(UnaryFunction)作用于一个序列的每个元素,结果是另一个序列。后一序列的元素数目等于前一序列,两者的对应位置上的元素具有某种逻辑上的对应关系。譬如:
LIST 1: Person1, Person2, Person3, Person4
LIST 2: 1500, 4000, 5000, 8000
对应关系:LIST2中每个元素(Integer)是LIST1中对应元素(Person)的salary属性。
过滤(filter):将某种判断条件(UnaryPredicate)作用于一个序列中的每个元素,结果是另一个序列。后一序列的元素少于或等于前一序列,后一序列包含的是前一序列中符合该判断条件的那些元素。譬如:
LIST 1: Person1, Person2, Person3, Person4
LIST 2: Person1, Person4
判断条件:LIST2中每个元素(Person)都来自LIST1,并且gender属性等于"Male"。
累加(accumulate):给定一个初始值及一个操作(BinaryFunction),将该操作逐一作用于序列的每个元素,结果是一个值。结果值代表遍历该序列之后的总值,包括序列中的最大(最小)值、序列总和(总乘积)等等。譬如:
LIST 1: 1, 2, 3, 4
RESULT: 12
累加操作:求两个元素的和。
初始值:0。
意义:求一个序列的总和。
大部分循环、判断的程序结构都是在做这几件事。我把它们封装成Functor,并且写了一段没有for循环、没有if判断的程序。这样做的好处是:(1)分离流程控制与流程中的操作;(2)流程与操作都不需要局部状态。缺点是:用Java的语法写出来太不自然,而且很多地方损失了编译期类型检查。