Clojure没有for循环,也没有可以直接改变的变量。
Commons Lang的StringUtils类
indexOfAny对str中的字符进行遍历,并报告第一处能与searchChars中任意一个字符相匹配的字符位置,如果未能成功匹配则返回-1。
indexOfAny中有两处if、两处for、三处可能的返回点和三个可变的局部变量,同时方法的长度为14行。
Clojure版本的index-of-any。倘若只想要找出匹配,使用Clojure的filter即可做到。但还希望能够找出匹配位置的索引。
indexed 返回一个序列,该序列由成对的[idx elt]组成。
Clojure的filter相似的index-filter函数,只不过它返回的是索引,而非匹配项本身。
Clojure的for用于序列解析(sequence comprehension),而不是循环。仅当(pred elt)为真时,(indexed coll)中的索引/元素对才会与名称idx和elt绑定。最后,根据每一对匹配结果的idx值将出结果序列。
Clojure的集合(set)本身也可以用做函数,判定目标是否存在。可以向index-filter 传入一个字符集合和一个字符串,然后得到同属于它们两者的字符在字符串中的索引。
index-filter 返回了所有匹配位置的索引,仅需要第一处而已。
● indexOfAny只能检索字符串,然而index-of-any可以检索任意序列。
● indexOfAny只能依据一组字符进行匹配,而index-of-any可以依据任意谓词进行匹配。
● indexOfAny 只能返回第一处匹配,而 index-filter 能够返回所有的匹配,并且还能进一步与其他过滤器进行组合。
● 命令式的indexOfAny 必须处理一些特殊情况:字符串为 null,或者是个空字符串;搜索字符集为 null,或者是个空集合。为了处理这些特殊情况,流程分支和方法退出点不可避免的增多了。然而对于函数式而言,无须任何显式的编码,绝大多数此类特例都能得到正确的处理。
● 命令式的indexOfAny引入了局部变量用于遍历容器(字符串和字符集合)。通过使用map这样的高阶函数和for这样的序列解析式,函数式的index-of-any能够规避所有对变量的需求。
命令式与函数式indexOfAny的复杂度对比