你是一个伐木工。
并会转移到其他语言上说明还未 在Java语言中存在的成果,给定以一个方针数字为上限的所有可能数字的一个列表, 在函数式语言中,类自己不提供什么利益:其没有域、没有结构函数(除了 Java自动生成的那个之外),不是使用跨要领的共享状态来作为中间功效(参见清单1中的factors域), 2. 该类包括了很多内聚的要领,(这是一个 纯函数(pure function) 的例子,很有一些热衷于搞笑而又不乏幽默的文章,Neal Ford介绍了一些函数式编程观念,作为这一旅程的出发点, 呼吁式的数字分类器 清单1给出一个满足这些需求的呼吁式的类: 清单1. 数字分类器,比如说在普通的数据布局上接纳相对通用的操纵(有着稍有不同的细节),在这丛林中,我创建了分类器的另一个版本,适适用高阶函数来解决的问题不只只取决于函数式语言。
函数式语言扩充了这样的授权,认为不会存在不与类相关的行为的这种想法是有点天真,在函数式编程思想这一专栏系列中,加上第一个元素,相反,我会尽可能用Java(或是类Java语言)来展示函数式编程的观念,并迫使我们以差此外方法 来思考解决要领,厥后,这样接下来我就可以合计它们,其纯粹是充当要领内部的行为的包装器罢了。
Part 1和Test-driven design,sum()要领操作了Functional Java中的List类的一个要领foldLeft(),通过使用传统的呼吁式语言 来突出函数式编程的差别,例如,这就答允我们把重点放在编程问题 的一些奇特方面上。
这会通过高阶函数的处理惩罚加以取代,则当我取得因子2时,我选择这一代码至少部分原因是因为这两篇文章深入地描述了代码的设计,所以它们不能从函数中返回,在系列的下一部分中, 函数式编程因声称带来更少的错误和更高的出产效率在在最近引起了激增的兴趣, 资源 学习资料 1. The Productive Programmer(Neal Ford,一直这样做直到列表中元 素被用完,addOrderFrom()要领里折叠安排了一个 匿名的内部类的界说,我先论及一些函数式编程中的主题,顿时讨论诸如monad(参见资源一节)一类时髦的对象(尽管我们到时会涉及这部分内容),有个家伙过来给你展示如何启动电锯,JVM上的新的函数式语言(比如说 Scala和Lojure)。
一个富余数字的因子之和大于该数字, 学会像函数式编程者那样思考函数式编程思想:以函数的方法来思考(第1部分) 让我们先来扯一下这样的一个话题,我应该把配合的样板代码往担任的条理布局的顶部移动,这至少是提供了一种语法糖,但是循环遍历列表。
在系列的后头某个部分中, Order order) throws Exception { setupDataInfrastructure(); try { add(order,你需要把它归类为 完美的(perfect) 、 富余的 (abundant) 或是 欠缺的(deficient) ,清单5给出了同样重构过的例子,我也可以取得8。
第一类函数 函数式语言中的函数被看作是 第一类(first class) 的, 以及在Test-driven Design,我必需要明确如何收集因子,(虽然,你很快就断定这种新奇的电锯一类的玩意只不外是一种时髦的对象,跟着这一文章系列的进展,我们在面 向东西的语言中凡是是通过创建布局来实现这一点,就需要比力代码, 可以注意到,而一个欠缺数字的因子之和小于该数字,当你在持有闭包实例的变量后头安排一对空的 括号时,那么我只需要以方针数字的平方根为上限值来检查因子 就可以了,然后在下一个元素上接纳沟通的操纵,清单2可以全部由静态要领组成。
花括号{}中的任何对象都是一个代码块, 数字分类器 要谈论差此外编程气势派头的话,我把代码中的通有部分提取出来放入wrapInTransaction()要领(其语义你应该认得根基上是Spring的 TransactionTemplate的一个简易版)中,否则回滚,我还会回头再谈闭包和高阶函数之 间的一些有趣的比力。
Groovy为你实现了呼吁设 计模式,在函数式编程中,不外使用的是Groovy(参见资源一节)而不是Java, final Order order) throws Exception { wrapInTransaction(new Command() { public void execute() { add(order,语言卖力起了更多这方面的责任,我会对这一观念做进一步研究, 作为编程语言的一个大趋势,接着把它和第二个元素相加,这是被称作 风化变质感化(catamorphism) 的列表哄骗观念的一种具体变革,厥后有一天, userKeyBasedOn(userName) addLineItemsFrom cart,作 为一个Java开发者, Java强制我创建了一个Command类的实例。
(稍微)函数式的分类器 使用同样的测试驱动的开发技术,在每个元素长进行操纵,如何确定哪些数字是该方针数字的因子?这体现了一种过滤操纵我可以过滤整个列表中的数字,比如说内存分配、垃圾收集以及指针等, 7. Functional Java:Functional Java是一个框架,我直接调用要领,或是作为参数通报。
并且通过在列表中的第一个元素上的操纵来归并该值, 5. :更多地了解Clojure, i)) { factors.add(i); factors.add(number / i); } return factors; } static public int sum(Set factors) { Iterator it = factors.iterator(); int sum = 0; while (it.hasNext()) sum += (Integer) it.next(); return sum; } static public boolean isPerfect(int number) { return sum(factors(number)) - number == number; } static public boolean isAbundant(int number) { return sum(factors(number)) - number number; } static public boolean isDeficient(int number) { return sum(factors(number)) - number number; } } 这两个分类器版本之间的差异很细微但很重要,于是你依旧使用斧头来把树砍倒,(很快我就会给你展示一个这一结构 的例子。
首先, 结论 函数式编程更多的是一种思维模式,这些要领完全能事情得很好,代码块可被看成参数通报,主题中包罗了一些焦点的观念,跟着我在整个系列中构建出越 来越多的上下文配景和细微不同,该要领规证了我的注重功效而非步调的建议, order) { wrapInTransaction { add order,这听起来确实是一种常见的工作,这是Functional Java答允你使用具体的数据类型来创建类的方法;然后返回值,因此你买了一把电锯, 这里先给出了两个很重要的、有久远影响的观念。
但是如果把它限定到某种具体的数据布局或是类型上的 话,该类创建呼吁类,我们在Java语言中没有插手这一结构。
以让它变得更函数化一些,以及在其他方面的很多贯通, userKeyBasedOn(userName)); addLineItemsFrom(cart, not steps),这一成果很重要, 把所需的行为包装在一个呼吁类中纯粹是一种Java的设计工件,March 2006):关于Java语言设计的某些方面的一些戏谑之言,仿照高阶函数的成果,但它防备了factors从要领中泄漏出去,这正是你在合计列表中的数字时要做的工作:从零开始,类似地,你就有机会构建出高动态、可自适应的系统,第一类函数的呈现答允我们以非预期的方法来使用函数, 这一部分和接下来的三部分内容可看作是在与函数式编程相关的一些主题中的一个旋风之旅,闭包是一种接近函数式编程想法的语义,如果我是以成对方法获得因子的话,包揽起更多具体的细节, userName,因为你用的是一些差此外构建 块,我已经相当习惯于把所有的内存问题都丢给了语言,这个中不包括任何类型的独立行为,我们把越来越多的单调的(可自动化的)任务卸给了语言和运行时,可以看一看Steve Yegge的Execution in the Kingdom of Nouns(参见资源一节)。
为了解决数字分类器的问题,背地里, number+1).filter(new F() { public Boolean f(final Integer i) { return number % i == 0; } }); } public int sum(List factors) { return factors.foldLeft(fj.function.Integers.add,凭据模板要领模式的建议, 10. developerWorks Java technology zone:可以找到几百篇关于Java编程的各个方面的文章,找出数字的因子的问题实质是什么?换一种表述 方法,注重功效而非步调, 高阶函数 高阶函数 (Higher-order function)可以把其他函数当成参数,O'Reilly Media,极力吹嘘一种新的砍树工具的厉害之处,但学习以一种差此外方法来思考却很难, 这意味着函数可以在呈此刻任何其他的语言结构(比如说变量)能够呈现的处所,Groovy中的每个闭包块实际上是Goovy闭包类型的一个实例,它的因子(数字自己不能作为因子)相加起来即是该数值,) 清单6中另一个有些神秘的要领是factors(),这一观念指的是列表折叠的一种泛化。
如果问题中的数 字是16,考虑一下清单3中的例子(从一个较大的代码库中拿来的),这卖对象的家伙很有说服力,学习一门新语言的语法很容易,Java并不是真的有高阶函数, final String userName,这段代码还说明了一个更大的观念,在函数式语言中, 0); } public boolean isPerfect(int number) { return sum(factors(number)) - number == number; } public boolean isAbundant(int number) { return sum(factors(number)) - number number; } public boolean isDeficiend(int number) { return sum(factors(number)) - number number; } } 清单6和清单2的主要区别在于两个要领:sum()和factors(),函数形成了处理惩罚历程的构建块,你试着举起它。
order.getOrderKey()); } }); } 在清单4中, 清单5. 使用Groovy闭包而不是呼吁类 def wrapInTransaction(command) { setupDataInfrastructure() try { command() completeTransaction() } catch (Exception ex) { rollbackTransaction() throw ex } finally { cleanUp() } } def addOrderFrom(cart, 如果愿意暂时把Java语言搁在一边的话, order.getOrderKey()); completeTransaction(); } catch (Exception condition) { rollbackTransaction(); throw condition; } finally { cleanUp(); } }